5

CGContextDrawImage呼び出しでEXEC_BAD_ACCESSエラーが発生し、それをトレースバックしようとしています。PNG画像があり、UIImagePNGRepresentationを実行すると、NSDataインスタンスが表示されます。

これをCGImageRefインスタンスに変換する必要があるので、このCGImageRefを使用してCGImageCreateWithPNGDataProviderメソッドを実行できます。

私は2つの方法を試しました:1)それをキャストする。

CGImageRef ref =(CGDataProvider)nsdata;

2)CGDataProviderCreateWithCFData(nsdata);を実行します。

最初のケースでは空の画像が返されますが、コマンドは失敗しません。CFDataではなくNSDataを使用しているにもかかわらず、2番目のケースを試した理由は、それを読んだことで両方が受け入れられることを覚えているからです。理由が何であれ、これが原因で失敗しています。

PNG NSDataを使用して、破損していないCGImageを作成する方法はありますか?助けてください。

ありがとう

4

2 に答える 2

9

2 回目の試行はほぼ正しいです。CFData と NSData は「無料でブリッジ」されています。CFDataRef を受け入れるものはすべて NSData も受け入れます (その逆も同様です)。正しくキャストする必要があります。

必要なもの:

CGDataProviderCreateWithCFData((CFDataRef)myNSData);
于 2010-08-21T01:38:01.477 に答える
3

最初は非常に間違っています。キャストNSDataするだけでは、インスタンスを に変えることはできません。CGImageRef

2番目はうまくいくはずです。NSDataインスタンスをにキャストする必要がありますが、Apple が無料のブリッジングCFDataRefと呼んでいるため、これは完全に合法です。

別の、はるかに簡単な方法を次に示します。

NSData* data = ... get raw image data from somewhere (PNG, JPEG, etc.) ...;
UIImage* image = [UIImage imageWithData: data];
CGImageRef imageRef = image.CGImage;

UIImage私は、高レベルのメソッドを使用して画像をロードしimage.CGImage、低レベルの Core Graphics 関数を使用することを好みます。UIImage保管する必要がある場合は、適切に保管することを忘れないでください。

于 2010-08-21T01:37:37.870 に答える