2011-01-07 89 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時相比更大的檢索。