6

があり、UIImageそのデータをファイルに入れてから、マップされたファイルを使用してメモリを節約したいと思います。どうやら、UIImageデータはプライベートであり、それにアクセスすることはできません。それを解決するための提案はありますか?

ありがとう!

4

1 に答える 1

8

エンコードされた画像データをメモリマップする場合は、ファイルをmmapし、CGDataProviderRefをCGImageCreateに渡してデータへの参照を提供します。

mapped = mmap( NULL , length , ... );
provider = CGDataProviderCreateWithData( mapped , mapped , length , munmap_wrapper );
image = CGImageCreate( ... , provider , ... );
uiimage = [UIImage imageWithCGImage:image];
...

munmap_wrapperは次のようなものです。

// conform to CGDataProviderReleaseDataCallback
void munmap_wrapper( void *p , const void *cp , size_t l ) { munmap( p , l ); }

エンコードされたソースデータの代わりに実際のピクセルをメモリマップする場合は、CGBitmapContextで同様のことを行います。また、プロバイダーと画像を作成して、画像がコンテキストと同じピクセルを参照するようにします。コンテキストで描画されるものはすべて、画像のコンテンツになります。幅、高さ、色空間、およびその他のパラメータは、コンテキストと画像で同じである必要があります。

context = CGBitmapContextCreate( mapped , ... );

この場合、長さは少なくともbytes_per_row * heightバイトになるため、ファイルは少なくともその大きさである必要があります。

既存の画像があり、ピクセルをmmapする場合は、画像のサイズと色空間を使用してビットマップコンテキストを作成し、CGContextDrawImageを使用してコンテキストに画像を描画します。

画像のソースは指定していませんが、実行時に画像を作成する場合は、ビットマップコンテキストで直接作成する方が効率的です。画像を作成するには、舞台裏でビットマップコンテキストが必要になるため、最初からメモリマップされたものである可能性もあります。

于 2010-07-18T04:20:51.420 に答える