UIImageから基になるNSDataを取得する


104

私は作成することができますUIImageから、NSData使用[UIImage imageWithData:]または[UIImage initWithData:]方法。

NSDataは既存のものから取り戻すことができるのだろうかUIImage?の何かNSData *myData = [myImage getData];

回答:


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

または

NSData *imageData = UIImagePNGRepresentation(image);

データをPNG形式とJPG形式のどちらにするかによって異なります。


82
なぜこの回答が何度も賛成票が投じられたのか、また受け入れられたのかはわかりません。OPは、最初に提供されたデータを取得するように求めました。UIImageJPEGRepresentationまたはUIImagePNGRepresentation 使用する、データ変更され、再変換されます。求められていることを実際に達成する方法はありますか?
Patrik

6
この答えは良くありません。すでに非可逆フォーマットになっていると、画像の品質が低下するためです。
1dayitwillmake 2013

@CipherCom正確なデータを取り戻したいというあなたの言っていることがわかります。しかし、私は質問に遭遇する大多数の人々にとって、この答えは彼らのニーズに最適であると思います...それゆえ賛成票です。元のデータを取り戻すための答えに遭遇した場合は、共有してください;)
tybro0103 '06 / 03/16

@ 1dayitwillmakeでもPNG担当者ですか?私の専門分野ではありませんが、PNGは損失を被らないと思いましたか?
tybro0103 2014年

@Bob Sprynこれは役に立ちません。プロパティCIImageは、imageWithCIImage:で初期化された場合にのみ設定されます。また、これは直接使用されるデータではなく、別の画像表現オブジェクトです。
King-Wizard

21

を使用してUIImageオブジェクトを初期化するとinit(data: originalData)、それoriginalDataはある種の内部形式の生データに変換されます。これらのデータは後で取得できます

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

ただし、rawDataはrawであるため、を使用する場合よりもさらに大きくなりUIImagePNGRepresentationます。


Objective-Cでこれを行う方法
h3dkandi

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

@ZardozSpeaks obj-cバリアントは、この回答の編集として含めることが完全に実行可能です。
Kamil.S、

6

UIImageは表示用にフォーマットされたオブジェクトであるため、元のデータ(おそらくPNGまたはJPEG形式)ではなく、ピクセル配列またはその他の内部形式を使用することが予想されます。つまり、UIImage(data: foo)は保持されませんfoo

  1. プログラムの他の場所で使用したい場合は、元のUIImageで問題ありません(ここでは実際にはそうではないと思います)。

  2. シリアライズしたい場合は機能しますUIImagePNGRepresentation(...)が、オリジナルがJPEGの場合はサイズが大きくなります。UIImageJPEGRepresentation(...)多くの場合、データがややオーバーサイズになり、元のファイルがPNGの場合は少し損失があります。画像が表示される方法と提供されると予想される形式に基づいて1つを選択しても問題ありません。たまたま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) 

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

3

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プロパティを追加しました。


基になるNSDataを取得するためにCIImageを使用する方法が表示されません...何か不足していますか?
tybro0103 2014年

4
これは役に立ちません。プロパティCIImageは、で初期化された場合にのみ設定されますimageWithCIImage:。また、これは直接使用されるデータではなく、別の画像表現オブジェクトです。
Patrik、2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.