2011-01-07 88 views
91

我可以使用[UIImage imageWithdata:][UIImage initWithData]方法从NSData创建UIImage。从UIImage获取底层NSData *

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

这是不可能的吗?
谢谢

回答

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

NSData *imageData = UIImagePNGRepresentation(image); 

取决于如果你想在PNG格式或JPG格式的数据。

+62

我不知道为什么这个答案是经过了多次表决,也没有被接受。 OP要求检索最初给出的数据。使用'UIImageJPEGRepresentation`或`UIImagePNGRepresentation` **将**改变数据并进行重新转换。有什么方法可以真正实现所要求的吗? – CipherCom 2013-03-12 18:19:48

+5

这个答案并不好,因为如果它已经是有损格式,它会降低图像的质量。 – 1dayitwillmake 2013-07-17 17:24:32

+0

@CipherCom我明白你想要的确切数据。然而,我认为对于大多数遇到问题的人来说,这个答案对于他们的需求来说是完美的......因此,上涨。如果您遇到了获取原始数据的答案,请分享;) – tybro0103 2014-03-06 16:16:01

-2

自上述答案发布以来,事情发生了变化,对于那些仍在寻找的人来说,因为他们共享了CipherCom的担忧:iOS 5添加了CIImage property

3

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

这里是Caroiline的帖子的迅速转换。

var imageData = UIImagePNGRepresentation(image) 

或者

var imageData = UIImageJPEGRepresentation(image, 0.7) 
4

你可以期待着一个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) 
        } 
    } 
    
0

当初始化一个UIImage对象与init(data: originalData),那originalData会在某种内部格式转换成原始数据。这些数据可以稍后

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

然而,由于rawData是生的,它将是使用UIImagePNGRepresentation时相比更大的检索。