Answers:
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,则通常会导致数据略微过大,并且数据会略有损失。可以根据显示图像的方式和期望提供的格式来选择一个。如果您碰巧正在使用PNG并想要PNG退出,则应该获得一个不错的文件大小和几乎相同的数据,除了特殊的PNG块。
如果要获取原始数据的精确副本(可能在缩略图后保存文件,或将其保存为SHA1),则需要单独保留它。您可能会执行以下操作:
var image:UIImage
var imageData:NSData {
didSet {
image = UIImage(data: imageData)
}
}
斯威夫特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
将更改数据并进行重新转换。有什么方法可以真正实现要求的?