从UIImage获取底层NSData

问题描述 投票:96回答:6

我可以使用UIImageNSData方法从[UIImage imageWithData:]创建[UIImage initWithData:]

我想知道我是否可以从现有的NSData获得UIImage?在NSData *myData = [myImage getData];线上的东西

cocoa-touch uiimage nsdata
6个回答
185
投票
NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality

要么

NSData *imageData = UIImagePNGRepresentation(image);

具体取决于您是希望数据采用PNG格式还是JPG格式。


14
投票

当使用UIImage初始化init(data: originalData)对象时,originalData将以某种内部格式转换为原始数据。以后可以使用这些数据进行检索

let rawData = myImage.cgImage?.dataProvider?.data as Data?

然而,因为rawData是原始的,它将比使用UIImagePNGRepresentation时更大。


6
投票

您可以预期UIImage是为显示格式化的对象,因此不会使用原始数据(可能是PNG或JPEG格式),但更可能是像素数组或其他内部格式。换句话说,UIImage(data: foo)不会保留foo

  1. 如果你只是想在你的程序中的其他地方使用它,原来的UIImage会很好(我认为这不是这里的情况)
  2. 如果你想序列化,UIImagePNGRepresentation(...)将工作,但如果原件是JPEG,将超大; UIImageJPEGRepresentation(...)通常会导致数据略大,如果您的原始版本是PNG,则会略有损失。根据图像的显示方式和您希望提供的格式选择一个应该是可以的。如果您正好使用PNG并希望PNG输出,您应该获得一个好的文件大小和几乎相同的数据,除了特殊的PNG块。
  3. 如果您想获得原始数据的精确副本(可能是在缩略图后保存文件,或者是SHA1),那么您需要单独保留它。你可以这样做: var image:UIImage var imageData:NSData { didSet { image = UIImage(data: imageData) } }

4
投票

只是因为我偶然发现了这一点,我喜欢迅速:)

这是Caroiline的帖子的快速翻译。

var imageData = UIImagePNGRepresentation(image)

要么

var imageData = UIImageJPEGRepresentation(image, 0.7) 

1
投票

Swift 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)

-2
投票

自上面给出答案以来,情况发生了变化,对于那些仍在寻找的人,因为他们分享了CipherCom的关注:iOS 5增加了CIImage property

© www.soinside.com 2019 - 2024. All rights reserved.