我在CGContextDrawImage调用中遇到EXEC_BAD_ACCESS错误并尝试追溯它。 我有一个PNG图像并运行UIImagePNGRepresentation o它给我NSData实例。
我需要将其转换为CGImageRef实例,因此我可以使用此CGImageRef运行CGImageCreateWithPNGDataProvider方法。
我试过两种方法: 1)投下它。
CGImageRef ref =(CGDataProvider)nsdata;
2)运行CGDataProviderCreateWithCFData(nsdata);
第一种情况返回空图像,但命令不会失败。 我尝试第二种情况的原因,即使我有NSData而不是CFData是因为我记得读它接受两者。 无论是什么原因,它都因此而失败。
有没有办法可以使用我的PNG NSData创建一个没有损坏的CGImage? 请帮忙。
感谢
答案 0 :(得分:9)
你的第二次尝试几乎是正确的。 CFData和NSData是“免费桥接”。任何接受CFDataRef的东西也接受NSData(反之亦然) - 你只需要正确投射。
你需要:
CGDataProviderCreateWithCFData((CFDataRef)myNSData);
答案 1 :(得分:3)
第一个是非常错误的。您无法仅通过投射将NSData
实例转换为CGImageRef
。
第二个应该可以正常工作。您必须将NSData
实例投射到CFDataRef
,但由于Apple称之为免费桥接,这是完全合法的。
这是另一种更简单的方法:
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
。