5

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

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

我尝试了两种方法:1)投射它。

CGImageRef ref = (CGDataProvider)nsdata;

2) 运行 CGDataProviderCreateWithCFData(nsdata);

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

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

谢谢

4

2 回答 2

9

你的第二次尝试几乎是正确的。CFData 和 NSData 是“免费桥接”。任何接受 CFDataRef 的东西也接受 NSData (反之亦然)——你只需要正确地转换。

你需要:

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

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

第二个应该可以正常工作。您必须将NSData实例转换为 aCFDataRef但这是完全合法的,因为 Apple 称之为toll-free bridging

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

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

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

于 2010-08-21T01:37:37.870 回答