2011-01-07 6 views
91

[UIImage imageWithdata:]または[UIImage initWithData]メソッドを使用してNSDataからUIImageを作成できます。UIImageから基になるNSData *を取得する

既存のUIImage *からNSData *を取得できるのだろうか?
何かの行NSData* myData = [myImage getData];

これは不可能ですか?
を使用すると、PNG形式またはJPG形式のデータが欲しい場合は、

答えて

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

または

NSData *imageData = UIImagePNGRepresentation(image); 

によってはありがとうございました。

+62

なぜこの回答が何度も投票されたことも受け入れられないのか分かりません。 OPは最初に与えられたデータを検索するように頼んだ。'UIImageJPEGRepresentation'または' UIImagePNGRepresentation' **を使用すると**データが変更され、再変換が行われます。求められたことを本当に達成する方法はありますか? – CipherCom

+5

これは、画像がすでに損失の多い形式になっていると、画像の品質が低下するため、この回答は良いことではありません。 – 1dayitwillmake

+0

@CipherCom正確なデータを元に戻すことについてあなたが言っていることを見ています。しかし、私は質問の向こうに来る大多数の人々のために、この答えは彼らのニーズに完璧になると思うので... upvotes。元のデータを元に戻す答えが出てきたら、共有してください;) – tybro0103

-2

上記の答えが与えられてから変更されたことは、CipherComの懸念事項を共有しているためです.iOS 5にはCIImage propertyが追加されています。私はこれにつまずいたと私はここ迅速:)

が好きという理由だけで

+0

CSImageを使用して基になるNSDataを取得する方法がありません...何か不足していますか? – tybro0103

+4

これは役に立ちません。プロパティ '' CIImage''は、 '' imageWithCIImage: ''で初期化されている場合にのみセットされます。また、これは直接使用されたデータではなく、むしろ別のイメージ表現オブジェクトです。 – CipherCom

3

はCaroilineのポストの迅速翻訳したものです。

var imageData = UIImagePNGRepresentation(image) 

それとも

var imageData = UIImageJPEGRepresentation(image, 0.7) 
+0

質問は迅速ではありませんでした。 –

4

あなたはUIImageは(PNGまたはJPEG形式で、おそらくある)が、より可能性の高い表示用にフォーマットされたオブジェクトであるので、元のデータを使用しないことを期待することができますピクセルアレイまたは他の何らかの内部フォーマットである。つまり、UIImage(data: foo)fooを保持しません。

  1. あなたは自分のプログラム内の他の場所でそれを使用したい場合は、元UIImageは問題ないでしょう(私はここで、実際にそうではないのです推測)

  2. あなたがシリアライズしたい場合は、UIImagePNGRepresentation(...)は動作しますが、オリジナルがJPEGの場合は大きすぎます。 UIImageJPEGRepresentation(...)は、しばしば、わずかに大きすぎるデータをもたらし、オリジナルがPNGの場合、わずかに損失があります。イメージが表示される方法と、提供されると予想される形式に基づいて1つを選択するのは間違いありません。 PNGを使用してPNGを使いたい場合は、適切なファイルサイズとほぼ同じデータ、特別なPNGチャンクを除いてください。

  3. 元のデータの正確なコピーを取得したい場合(サムネイル後にファイルを保存する場合や、SHA1に保存する場合など)、別々に保持する必要があります。 init(data: originalData)UIImageオブジェクトを初期化するときoriginalDataは、内部形式のいくつかの種類に生データに変換されることを、

    var image:UIImage 
    var imageData:NSData { 
        didSet { 
         image = UIImage(data: imageData) 
        } 
    } 
    
0

:あなたのような何かをするかもしれません。これらのデータは、しかし

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

rawDataが生であるので、UIImagePNGRepresentationを使用した場合よりもさらに大きくなるだろうと後で検索することができます。

関連する問題