2009-07-03 7 views
1

ポインタデータ iphoneアプリケーションで生成された画像を指している場合。 CGBitmapContextCreateを使用してこのデータのコピーを作成した場合、または「インプレース」のイメージを使用している場合は誰ですか?iphone:新しいメモリを割り当てずに画像を作成する

理想的には、データ*の情報を再利用し、このイメージの追加コピーを作成しないことが理想的です。

void* data = <my data>; 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef imageContext = CGBitmapContextCreate(data, w, h, 8, w*8, colorSpace, kCGBitmapByteOrder32Big|kCGImageAlphaPremultipliedLast); 
CGImageRef imageRef = CGBitmapContextCreateImage(imageContext); 
UIImage* image =[[UIImage alloc] initWithCGImage:imageRef]; 

もっと一般的には、イメージを作成するこの方法は、私にとってはむしろ複雑です。誰がここで何が起こっているのか分かっていますか? UIImageを作成する簡単な方法はありますか?

おかげ

答えて

1

何、このようなものについて:hereから

void * data = <my data>; 
NSData * newData = [NSData dataWithBytesNoCopy:data length:lengthOfData]; 
UIImage * image = [[UIImage alloc] initWithData:newData]; 
+2

- [UIImage initWithData]はイメージデータをデコードし、そのプロセスでコピーを作成します。メモリを割り当てずにイメージを真に作成するには、iPhoneがコピーオンライトをサポートしているピクセル形式でデータをプリデコードし、CGBitmapContextCreateを使用する方法があります。 – rpetrich

+0

実際に正しく動作させることができませんでした。フォーマットとサイズの情報をUIImageに渡しますか?確かに何かが欠けている。 –

2

それはちょうどあなたが渡されたメモリを使用しますCGBitmapContextCreateのように見えますが、データはCGBitmapContextCreateImage、

への呼び出しによってコピーすることができます。

アップルのドキュメント:

考察C CGBitmapContextCreateImageによって が返されたGImageオブジェクトは、コピー 操作によって作成されます。ビットマップグラフィックスコンテキスト へのその後の変更は、返されたイメージの内容には影響しません( )。 いくつかのケースでは、コピー操作は、実際に ビットの実際の物理的なコピーがビットマップグラフィックスコンテキストでのみ、基礎となるデータ 場合に発生するように 、コピーオンライトセマンティクスを以下の改変 あります。結果として、 ビットマップ グラフィックスコンテキストに 追加描画を実行する前に、 が結果イメージを使用して、 をリリースします。このようにして、 データの実際の物理コピーを避けることができます。

関連する問題