ぽんぽこ日記

プログラミング、読書、日々の生活

プリレンダリングした画像イメージを圧縮形式でキャッシュする方法

意外と日本語のエントリが少ないのでメモ。

PDFページの表示など、レンダリングして画像イメージを生成するのに非常に時間がかかってユーザビリティを損ねる場合、あらかじめプリレンダリングした画像イメージをキャッシュとして置いておきたい。しかしiOSデバイスはメモリ制限が厳しいため、ディスクやCore Dataストレージ等に書き出しておくのが現実的だろう。

ビットマップコンテキストに何かしら描画を行った後、

      CGImageRef image = CGBitmapContextCreateImage ( context );
      NSData *renderedImage = UIImageJPEGRepresentation([UIImage imageWithCGImage:image ],0.5);

(ここで0.5と指定しているのはJPEG圧縮の品質。)
もしくはPNG形式なら、

    NSData *renderedImage = UIImagePNGRepresentation([UIImage imageWithCGImage:image ]);

を呼び出してやることでと、JPEG/PNG形式の画像データをを内容に持つNSDataオブジェクトが取得できるようだ。あとは、このrenderedImageを、Core DataならManaged objectのプロパティに代入してsaveするか、アプリのドキュメントディレクトリなどに直接保存するならNSData#writeToXXX系のメソッドを使えば永続化できる。


次にキャッシュしたイメージを再表示するには、読み出してきたrederedImageからCGDataProviderを作成し、CGImageCreateWithJPEGDataProviderもしくはCGImageCreateWithPNGDataProviderに渡せばよい。

    CGDataProviderRef provider = CGDataProviderCreateWithCFData ( (CFDataRef)renderedImage );
    CGImageRef    image =  CGImageCreateWithJPEGDataProvider (
		  					  provider,
							  NULL,
						  	  FALSE,
						  	  kCGRenderingIntentDefault
						  );
    CGDataProviderRelease(provider);