从UIImage获取基础的NSData


104

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

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

Answers:


191
NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality

要么

NSData *imageData = UIImagePNGRepresentation(image);

取决于您要使用PNG格式还是JPG格式的数据。


81
我不知道为什么这个答案被否决了那么多次,也没有被接受。OP要求检索最初提供的数据。使用UIImageJPEGRepresentationUIImagePNGRepresentation 更改数据并进行重新转换。有什么方法可以真正实现要求的?
Patrik

6
这个答案不好,因为如果图像已经是有损格式,则会降低图像的质量。
1dayitwillmake

@CipherCom我明白您在说什么想要返回准确的数据。但是,我认为对于大多数遇到问题的人来说,此答案将非常适合他们的需求……因此,赞成票。如果您遇到了找回原始数据的答案,请分享;)
tybro0103 2014年

@ 1dayitwillmake即使是PNG代表?不是我的专业领域,但我认为PNG不会遭受损失吗?
tybro0103 2014年

@Bob Spryn这无济于事。仅当使用imageWithCIImage:初始化属性CIImage时,才设置该属性。同样,这不是直接使用的数据,而是另一个图像表示对象。
King-Wizard

21

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

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

但是,由于rawData原始,因此它将比使用时更大UIImagePNGRepresentation


我如何在Objective-C中做到这一点
h3dkandi

NSData * rawData =(__bridge NSData *)CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
Zardoz

@Zardoz说出obj-c变体可以完美地包含在此答案中作为编辑。
Kamil.S

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

只是因为我偶然发现了这个,所以我喜欢swift :)

这是卡罗琳的帖子的快速翻译。

var imageData = UIImagePNGRepresentation(image)

要么

var imageData = UIImageJPEGRepresentation(image, 0.7) 

问题不是关于迅速。
Cross_

3

斯威夫特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属性


我没有看到使用CIImage来获取基础NSData的方法...我缺少什么吗?
tybro0103 2014年

4
这无济于事。该属性CIImage仅在使用初始化时设置imageWithCIImage:。同样,这不是直接使用的数据,而是另一个图像表示对象。
Patrik
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.