如何在iphone sdk上将NSData转换为CGDataProviderRef?

GAS*_*GAS 5 iphone uiimage cgcontext cgimage

我在CGContextDrawImage调用中收到EXEC_BAD_ACCESS错误并尝试追溯它.我有一个PNG图像并运行UIImagePNGRepresentation o它给了我NSData实例.

我需要将其转换为CGImageRef实例,因此我可以使用此CGImageRef运行CGImageCreateWithPNGDataProvider方法.

我尝试了两种方法:1)投下它.

CGImageRef ref =(CGDataProvider)nsdata;

2)运行CGDataProviderCreateWithCFData(nsdata);

第一种情况返回空图像,但命令不会失败.我尝试第二种情况的原因,即使我有NSData而不是CFData是因为我记得读它接受两者.不管是什么原因,它都因此而失败.

有没有办法可以使用我的PNG NSData创建一个没有损坏的CGImage?请帮忙.

谢谢

Tod*_*ell 9

你的第二次尝试几乎是对的.CFData和NSData是"免费桥接".任何接受CFDataRef的东西也接受NSData(反之亦然) - 你只需要正确投射.

你需要:

CGDataProviderCreateWithCFData((CFDataRef)myNSData);
Run Code Online (Sandbox Code Playgroud)

  • 如果您有ARC,请使用__bridge直接转换:CGDataProviderCreateWithCFData((__ bridge CFDataRef)myNSData); (2认同)

Ste*_*ntz 3

第一个是非常错误的。您不能简单地通过强制转换将NSData实例转变为实例。CGImageRef

第二个应该可以正常工作。您必须将NSData实例强制转换为 a CFDataRef,但由于 Apple 称之为免费桥接,这是完全合法的。

这是另一种更简单的方法:

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

我更喜欢使用更高级别的UIImage方法来加载图像,然后用于image.CGImage较低级别的 Core Graphics 功能。UIImage如果您需要保留它,请不要忘记妥善保留它。