2

主な機能を持つアプリケーションでは、大きな画像をテーブルビューに表示するようにしています。幅が1000ピクセル、サイズが1MB以上のものもあります。iOS用の大きな画像の圧縮とサイズ変更

私は古いデバイス(3GS)がこれらの処理に深刻な問題を抱えており、すぐにメモリの警告を送信することを発見しました。

私はイメージが持ち込まれているものを周りを取得することはできませんが、私は次元とファイルサイズの両方にそれらをより小さくすることができると思いました。だから私は、圧縮するため

NSData *dataForJPEGFile = UIImageJPEGRepresentation(img, 0.6) 

に見えたが、私は、これはメモリが

を警告などリサイズに役立つとは思わない:基本的にhttps://github.com/AliSoftware/UIImage-Resize

UIImage *newImage; 
UIImage *oldImage = [UIImage imageWithData:imageData] ; 
UIGraphicsBeginImageContext(CGSizeMake(tempImage.size.width,tempImage.size.height)); 
[oldImage drawInRect:CGRectMake(0, 0,320.0f,heightScaled)]; 
newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

ともに私はイメージを取って、サイズを小さくして、その場でファイル化し、古いものを削除するように再フォーマットしたい。これはこれを行う最善の方法ですか? 画像のキャッシュに役立つでしょうか? https://github.com/rs/SDWebImageのように?

答えて

0

テーブルビュー画像のサイズを変更する必要があり、もちろん、それも、それが小さなフレームで大きな画像よりも良く見えるのです。ストレージが問題で、必要なときに大きなイメージをダウンロードできるサーバーがあれば、ファイルシステムにある種のキャッシュを実装できます。 n-MBまでのイメージをそこに格納し、現在ファイルシステムにない新しいファイルが要求されたときは、最近使用したものを削除して新しいファイルをダウンロードします。

Ps:+[UIImage imageNamed:]を使用しないでください。キャッシュアルゴリズムや、それを使って読み込んだイメージを解放しないバグがいくつかあります。

+0

問題は、すべての異なるサーバーからのRSSフィードから画像が来ているため、画像がありません。 – daidai

+0

なぜそれは問題ですか? – xissburg

+0

私は、ファイルシステムにある種のキャッシュを実装する最良の方法は何もないと思いますか?どんなドキュメントやリンクがありますか? – daidai

2

あなたは完全に多くのメモリを節約し、クラッシュ/メモリの警告を防ぐことができますどの最初にそれらをデコードすることなく、大きな画像のサイズを変更するCGImageSourceCreateThumbnailAtIndexを使用することができます。

- (void)resizeImageAtPath:(NSString *)imagePath { 
    // Create the image source (from path) 
    CGImageSourceRef src = CGImageSourceCreateWithURL((__bridge CFURLRef) [NSURL fileURLWithPath:imagePath], NULL); 

    // To create image source from UIImage, use this 
    // NSData* pngData = UIImagePNGRepresentation(image); 
    // CGImageSourceRef src = CGImageSourceCreateWithData((CFDataRef)pngData, NULL); 

    // Create thumbnail options 
    CFDictionaryRef options = (__bridge CFDictionaryRef) @{ 
      (id) kCGImageSourceCreateThumbnailWithTransform : @YES, 
      (id) kCGImageSourceCreateThumbnailFromImageAlways : @YES, 
      (id) kCGImageSourceThumbnailMaxPixelSize : @(640) 
    }; 
    // Generate the thumbnail 
    CGImageRef thumbnail = CGImageSourceCreateThumbnailAtIndex(src, 0, options); 
    CFRelease(src); 
    // Write the thumbnail at path 
    CGImageWriteToFile(thumbnail, imagePath); 
} 

詳細here:あなたはサイズを変更したい画像へのパスをお持ちの場合は

、あなたはこれを使用することができます。

関連する問題