私は独自の画像ダウンローダ クラスを持っています。キューを保持し、一度に 1 つ (または一定量) の画像をダウンロードし、それらをキャッシュ フォルダに書き込み、必要に応じてキャッシュ フォルダから取得します。また、URL を渡すことができる UIImageView サブクラスもあります。イメージ ダウンローダー クラスを介して、イメージがデバイスに既に存在するかどうかを確認し、存在する場合は表示するか、終了後にダウンロードして表示します。
画像のダウンロードが完了したら、次のことを行います。ダウンロードした NSData から UIImage を作成し、ダウンロードした NSData をディスクに保存して、UIImage を返します。
// This is executed in a background thread
downloadedImage = [UIImage imageWithData:downloadedData];
BOOL saved = [fileManager createFileAtPath:filePath contents:downloadedData attributes:attributes];
// Send downloadedImage to the main thread and do something with it
既存の画像を取得するには、これを行います。
// This is executed in a background thread
if ([fileManager fileExistsAtPath:filePath])
{
NSData* imageData = [fileManager contentsAtPath:filePath];
retrievedImage = [UIImage imageWithData:imageData];
// Send retrievedImage to the main thread and do something with it
}
ご覧のとおり、私は常にダウンロードした NSData から直接 UIImage を作成します。UIImagePNGRepresentation を使用して NSData を作成することはないので、画像は圧縮されません。圧縮された NSData から UIImage を作成すると、UIImage はメイン スレッドでレンダリングする直前にそれを解凍し、UI をブロックします。私は現在、ディスクからダウンロードまたは取得する必要がある大量の小さな画像を含む UITableView を持っているため、スクロールが非常に遅くなるため、これは受け入れられません。
今私の問題。ユーザーはカメラロールから写真を選択して保存することもでき、UITableView にも表示する必要があります。しかし、UIImagePNGRepresentationを使用せずに、カメラロールからUIImageをNSDataに変換する方法を見つけることができないようです。だからここに私の質問があります。
UIImage を圧縮されていない NSData に変換して、後で imageWithData を使用して UIImage に変換し、レンダリング前に解凍する必要がないようにするにはどうすればよいですか?
また
UIImage をメインスレッドに送信してキャッシュする前に解凍を実行して、一度だけ解凍する必要がある方法はありますか?
前もって感謝します。