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)