[UIImage imageWithData:]
または[UIImage initWithData:]
メソッドを使用して、UIImage
からNSData
を作成できます。
既存のNSData
からUIImage
を取得できるのだろうか? NSData *myData = [myImage getData];
の行にあるもの
NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality
または
NSData *imageData = UIImagePNGRepresentation(image);
データをPNG形式とJPG形式のどちらにするかによって異なります。
UIImage
オブジェクトをinit(data: originalData)
で初期化すると、そのoriginalData
は何らかの内部形式の生データに変換されます。これらのデータは後で取得できます
let rawData = myImage.cgImage?.dataProvider?.data as Data?
ただし、rawData
は生なので、UIImagePNGRepresentation
を使用する場合よりもさらに大きくなります。
UIImageは表示用にフォーマットされたオブジェクトであるため、元のデータ(おそらくPNGまたはJPEG形式)を使用せず、ピクセル配列またはその他の内部形式を使用する可能性が高いと予想できます。つまり、UIImage(data: foo)
はfoo
を保持しません。
プログラムの別の場所で使用したいだけであれば、元のUIImageで問題はありません(実際にはそうではないと思います)。
シリアル化する場合、UIImagePNGRepresentation(...)
は機能しますが、元がJPEGの場合はサイズが大きくなります。 UIImageJPEGRepresentation(...)
を使用すると、多くの場合データがわずかに大きくなり、元の画像がPNGの場合はわずかに損失が大きくなります。画像の表示方法と提供される予定の形式に基づいて、1つを選択してもかまいません。たまたまPNGを使用していて、PNGを出力したい場合は、適切なファイルサイズとほぼ同じデータ、特別なPNGチャンクを取得する必要があります。
元のデータの正確なコピーを取得する場合(おそらく、サムネイル化した後、またはSHA1にファイルを保存するため)、個別に保持する必要があります。あなたは次のようなことをするかもしれません:
var image:UIImage
var imageData:NSData {
didSet {
image = UIImage(data: imageData)
}
}
私がこれにつまずいたので、Swift :)が好きです
以下はSwift Caroilineの投稿の翻訳です。
var imageData = UIImagePNGRepresentation(image)
または
var imageData = UIImageJPEGRepresentation(image, 0.7)
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)