web-dev-qa-db-ja.com

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

[UIImage imageWithData:]または[UIImage initWithData:]メソッドを使用して、UIImageからNSDataを作成できます。

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

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

または

NSData *imageData = UIImagePNGRepresentation(image);

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

185
Caroline

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

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

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

17
yesleon

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)
        }
    }
    
6
Jim Driscoll

私がこれにつまずいたので、Swift :)が好きです

以下はSwift Caroilineの投稿の翻訳です。

var imageData = UIImagePNGRepresentation(image)

または

var imageData = UIImageJPEGRepresentation(image, 0.7) 
4
nsij22

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
maslovsa