我可以使用 [UIImage imageWithData:]
或 [UIImage initWithData:]
方法从 NSData
创建 UIImage
。
我想知道是否可以从现有的 UIImage
中取回 NSData
? NSData *myData = [myImage getData];
线上的东西
NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality
或者
NSData *imageData = UIImagePNGRepresentation(image);
取决于您是否想要 PNG 格式或 JPG 格式的数据。
使用 init(data: originalData)
初始化 UIImage
对象时,该 originalData
将转换为某种内部格式的原始数据。这些数据可以稍后检索
let rawData = myImage.cgImage?.dataProvider?.data as Data?
但是,因为 rawData
是原始的,它会比使用 UIImagePNGRepresentation
时更大。
斯威夫特 4.2
let dataPng = image.pngData() // return image as PNG. May return nil if image has no CGImageRef or invalid bitmap format
let dataJpg = image.jpegData(compressionQuality: 1) // return image as JPEG. May return nil if image has no CGImageRef or invalid bitmap format. compression is 0(most)..1(least)
只是因为我偶然发现了这个,我喜欢 swift :)
这是 Caroiline 帖子的快速翻译。
var imageData = UIImagePNGRepresentation(image)
或者
var imageData = UIImageJPEGRepresentation(image, 0.7)
您可以预期 UIImage 是一个为显示而格式化的对象,因此不会使用原始数据(可能是 PNG 或 JPEG 格式),而更可能是像素数组或其他一些内部格式。换言之,UIImage(data: foo)
不会保留 foo
。
如果您只是想在程序的其他地方使用它,原始 UIImage 会很好(我认为这里实际上并非如此)如果您想序列化, UIImagePNGRepresentation(...) 将起作用,但如果原始 UIImage 是一个JPEG; UIImageJPEGRepresentation(...) 通常会导致数据稍微过大,并且如果您的原始文件是 PNG,则会有轻微的损失。应该可以根据图像的显示方式和您希望提供的格式来选择一个。如果您碰巧在使用 PNG 并希望将 PNG 输出,那么您应该获得良好的文件大小和几乎相同的数据,特殊的 PNG 块除外。如果您想获得原始数据的精确副本(可能是在缩略图之后保存文件,或者对其进行 SHA1 处理),那么您需要单独保留它。您可能会执行以下操作: var image:UIImage var imageData:NSData { didSet { image = UIImage(data: imageData) } }
我发现序列化/反序列化 UIImage(通过数据)的唯一解决方案是使用 this solution。
然后,无论 UIImage 是如何通过使用 UIImage 上的扩展方法创建的,您都可以序列化/反序列化:
let originalImage: UIImage = ...
let cgData = image.cgImage!.png!
let image = UIImage(data: cgData)!
自从给出上述答案以来,情况发生了变化,对于那些仍在寻找的人来说,因为他们与 CipherCom 有同样的担忧:iOS 5 添加了 CIImage property。
CIImage
仅在使用 imageWithCIImage:
初始化时才设置。这也不是直接使用的数据,而是另一个图像表示对象。
不定期副业成功案例分享
UIImageJPEGRepresentation
或UIImagePNGRepresentation
将更改数据并进行重新转换。有什么方法可以真正实现所要求的吗?