如何将 UIImage 转换为 NSData 或 CFDataRef?

Posted

技术标签:

【中文标题】如何将 UIImage 转换为 NSData 或 CFDataRef?【英文标题】:How do I convert a UIImage to NSData or CFDataRef? 【发布时间】:2011-10-31 01:03:27 【问题描述】:

如何将UIImage 转换为NSDataCFDataRef?我需要将CFDataRef 传递给ABPersonSetImageData

【问题讨论】:

【参考方案1】:

这对我有用,适用于 PNG 图像。对于其他图像类型,我假设您只需要找到相应的 UIImage...Representation 方法即可。

UIImage *image = [UIImage imageNamed:@"imageName.png"];
NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(image)];

如果您需要 UIImage 的 CFDataRef,只需多一行。

CFDataRef imgDataRef = (CFDataRef)imageData;

【讨论】:

你为什么使用+[NSData dataWithData:] 触摸。我想你可以这样做NSData *imageData = UIImagePNGRepresentation(image);【参考方案2】:

你可以用这个

NSData *imageData = UIImageJPEGRepresentation(image, 1.0);

只需将 imageData 转换为 CFDataRef

CFDataRef = (CFDataRef) imageData;

【讨论】:

NSData *imageData = UIImageJPEGRepresentation(image, 1.0);很慢也相当于png方法。有什么快速的方法吗??????【参考方案3】:
CFDataRef cfdata = CFDataCreate(NULL, [imageData bytes], [imageData length]);

点击here查看工作示例。

谢谢。

【讨论】:

【参考方案4】:

对于那些想知道NSDataCFData有什么区别的人,这里是Apple Docs的解释:

CFData 与其 Cocoa Foundation 对应物“免费桥接”, NS 数据。这意味着核心基础类型是 与桥接的函数或方法调用可互换 基础对象。换句话说,在您看到 NSData 的方法中 * 参数,你可以传入一个 CFDataRef,在你看到 CFDataRef 参数的函数中,你可以传入一个 NSData 实例。这 也适用于 NSData 的具体子类。请参阅免费桥接 有关免费桥接的更多信息的类型。

这解释了为什么将 NSData 转换为 CFData 有效。

【讨论】:

以上是关于如何将 UIImage 转换为 NSData 或 CFDataRef?的主要内容,如果未能解决你的问题,请参考以下文章

将UIImage转换为NSData并返回UIImage

将 UIImage 转换为 NSData 并在 Swift 中转换回 UIImage?

将UIImage转换为数据URI

有啥方法可以在不将 CIImage 转换为 UIImage 或 CGImage 的情况下将 CIImage 转换为 NSData?

将 NSData 数组转换为 UIImage 数组

将 UIImage 转换为 NSData 并与核心数据一起保存