回答:
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
はrawであるため、を使用する場合よりもさらに大きくなり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)
}
}
私がこれにつまずいて、私は迅速が好きだからです:)
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)
上記の回答が出されて以来、物事は変わっています。CipherComの懸念を共有しているためにまだ探している人のために:iOS 5がCIImageプロパティを追加しました。
CIImage
は、で初期化された場合にのみ設定されますimageWithCIImage:
。また、これは直接使用されるデータではなく、別の画像表現オブジェクトです。
UIImageJPEGRepresentation
またはUIImagePNGRepresentation
を使用すると、データが変更され、再変換されます。求められていることを実際に達成する方法はありますか?