Cocoa touch 从UIImage获取基础NSData
我可以使用Cocoa touch 从UIImage获取基础NSData,cocoa-touch,uiimage,nsdata,Cocoa Touch,Uiimage,Nsdata,我可以使用[UIImage imageWithData:][code>或[UIImage initWithData:][code>方法从NSData创建UIImage 我想知道是否可以从现有的UIImage中获取NSData? NSData*myData=[myImage getData]行中的某个内容 NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality 或 取决于您希望数据是PNG格
[UIImage imageWithData:][code>或[UIImage initWithData:][code>方法从NSData
创建UIImage
我想知道是否可以从现有的UIImage
中获取NSData
?
NSData*myData=[myImage getData]行中的某个内容代码>
NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality
或
取决于您希望数据是PNG格式还是JPG格式。自从给出上述答案以来,情况已经发生了变化,对于那些因为与CipherCom有共同顾虑而仍在寻找的人来说:iOS 5添加了。只是因为我偶然发现了这一点,我喜欢swift:)
这是Caroiline帖子的快速翻译
var imageData = UIImagePNGRepresentation(image)
或
可以预期UIImage是为显示而格式化的对象,因此不会使用原始数据(可能是PNG或JPEG格式),而更可能是像素阵列或其他内部格式。换句话说,UIImage(data:foo)
将不会保留foo
如果您只想在程序中的其他地方使用它,那么原始UIImage就可以了(我想这里的情况并非如此)
如果要序列化,UIImagePNGRepresentation(…)
将起作用,但如果原始文件是JPEG,则会过大UIImageJPEGRepresentation(…)
通常会导致数据稍微过大,如果原始数据是PNG,则会稍微有损。可以根据图像的显示方式和您希望提供的格式选择一个。如果您碰巧正在使用PNG输入,并且想要输出PNG,那么您应该获得一个好的文件大小和几乎相同的数据,除了特殊的PNG块
如果您想获得原始数据的精确副本(可能是为了在缩略图后保存文件,或者是为了将其删除),则需要单独保留它。您可能会这样做:
var image:UIImage
var imageData:NSData {
didSet {
image = UIImage(data: imageData)
}
}
使用init(数据:originalData)
初始化UIImage
对象时,该originalData
将转换为某种内部格式的原始数据。这些数据可以在以后使用
let rawData = myImage.cgImage?.dataProvider?.data as Data?
但是,由于rawData
是原始数据,因此它将比使用UIImagePNGRepresentation
时更大
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)
我不知道为什么这个答案被投了这么多票,也不知道它被接受了。OP要求检索最初提供的数据。使用uiimagejpegresentation
或UIImagePNGRepresentation
将更改数据并重新转换。是否有任何方法可以真正实现所要求的?这个答案不好,因为如果图像已经是有损格式,它会降低图像质量。@CipherCom我明白你的意思了,就是要取回准确的数据。然而,我认为对于大多数遇到这个问题的人来说,这个答案将非常适合他们的需要。。。因此,投票结果是一致的。如果您遇到了一个返回原始数据的答案,请分享;)@1哪怕是PNG代表都会成功?不是我的专业领域,但我认为PNG不会遭受损失?@Bob Spryn这没用。仅当使用imageWithCIImage:初始化属性CIImage时,才设置该属性。此外,这不是直接使用的数据,而是另一个图像表示对象。我没有看到使用CIImage获取底层NSData的方法。。。我错过什么了吗?这没用。属性CIImage
仅在使用imageWithCIImage:
初始化时设置。另外,这不是直接使用的数据,而是另一个图像表示对象。问题不是关于swift。在Objective CNSData*rawData=(uu桥NSData*)CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage))中,我如何做到这一点@Zardozs表示obj-c变体完全可以作为编辑包含在本答案中。
let rawData = myImage.cgImage?.dataProvider?.data as Data?
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)