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

如何在iphone sdk上将NSData转换为CGDataProviderRef?,iphone,uiimage,cgcontext,cgimage,Iphone,Uiimage,Cgcontext,Cgimage,我在CGContextDrawImage调用中遇到EXEC\u BAD\u访问错误,并试图将其追溯到以前。 我有一个PNG图像,运行UIImagePNGREO演示,它给了我NSData实例 我需要将其转换为CGImageRef实例,以便使用此CGImageRef运行CGImageCreateWithPNGDataProvider方法 我尝试了两种方法: 1) 投下它 CGImageRef ref=(CGDataProvider)nsdata 2) 运行CGDataProviderCreateWi

我在CGContextDrawImage调用中遇到EXEC\u BAD\u访问错误,并试图将其追溯到以前。 我有一个PNG图像,运行UIImagePNGREO演示,它给了我NSData实例

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

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

CGImageRef ref=(CGDataProvider)nsdata

2) 运行CGDataProviderCreateWithCFData(nsdata)

第一种情况返回空图像,尽管命令没有失败。 我之所以尝试第二种情况,即使我有NSData而没有CFData,是因为我记得读到它时,它接受这两种情况。 不管是什么原因,它都因此而失败

有没有一种方法可以使用PNG NSData创建未损坏的CGImage? 请帮忙


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

第二个应该很好。您必须将
NSData
实例转换为
CFDataRef
,但这是完全合法的,因为苹果称之为免费桥接

下面是另一个更简单的方法:

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

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

您的第二次尝试几乎是正确的。CFData和NSData是“免费桥接”的。任何接受CFDataRef的内容也接受NSData(反之亦然)——您只需正确地强制转换即可

你需要:

CGDataProviderCreateWithCFData((CFDataRef)myNSData);

image.CGImage
绝对优于
(CGImageRef)[(id)CGImageCreateWithPNGDataProvider((CGDataProviderRef)[(id)CGDataProviderCreateWithNSData((CFDataRef)uiimagePngPresentation(image))autorelease],0,0)autorelease]
注意,UIKit不是线程安全的,因此,在后台线程上创建
UIImage
实例可能会导致问题。在某些情况下,最好直接创建一个
CGImageRef
@cheeesus,根据苹果的文档(),在后台线程中创建UIImage实例是安全的:“图像对象的不可变性质也意味着它们可以从任何线程安全地创建和使用。”,使用uu桥直接转换:CGDataProviderCreateWithCFData((uu桥CFDataRef)myNSData);