【问题标题】:Get underlying NSData from UIImage从 UIImage 获取底层 NSData
【发布时间】:2011-06-05 04:00:56
【问题描述】:

我可以使用[UIImage imageWithData:] 或[UIImage initWithData:] 方法从NSData 创建UIImage。

我想知道是否可以从现有的 UIImage 中取回 NSData? NSData *myData = [myImage getData];线上的东西

【问题讨论】:

    标签: cocoa-touch uiimage nsdata


    【解决方案1】:

    我发现序列化/反序列化 UIImage(通过数据)的唯一解决方案是使用 this solution。

    然后,无论 UIImage 是如何创建的,您都可以使用 UIImage 上的扩展方法进行序列化/反序列化:

    let originalImage: UIImage = ...
    let cgData = image.cgImage!.png!
    let image = UIImage(data: cgData)!
    

    【讨论】:

      【解决方案2】:

      斯威夫特 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)
      

      【讨论】:

        【解决方案3】:

        当使用init(data: originalData) 初始化UIImage 对象时,originalData 将被转换为某种内部格式的原始数据。这些数据可以在以后检索到

        let rawData = myImage.cgImage?.dataProvider?.data as Data?
        

        但是因为rawData 是原始的,它会比使用UIImagePNGRepresentation 时更大。

        【讨论】:

        • 我如何在 Objective-C 中做到这一点
        • NSData *rawData = (__bridge NSData *) CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
        • @ZardozSpeaks obj-c 变体完全可行,可以作为编辑包含在此答案中。
        【解决方案4】:

        您可以预期 UIImage 是一个为显示而格式化的对象,因此不会使用原始数据(可能是 PNG 或 JPEG 格式),而更可能是像素数组或其他一些内部格式。换句话说,UIImage(data: foo) 不会保留foo。

        1. 如果你只是想在程序的其他地方使用它,原始的 UIImage 就可以了(我想这里实际上并非如此)

        2. 如果您想序列化,UIImagePNGRepresentation(...) 可以工作,但如果原始文件是 JPEG,则会过大; UIImageJPEGRepresentation(...) 通常会导致数据略微过大,并且如果您的原始文件是 PNG,则会有轻微的损失。应该可以根据图像的显示方式和您希望提供的格式来选择一个。如果您碰巧在使用 PNG 并希望将 PNG 输出,您应该得到一个合适的文件大小和几乎相同的数据,特殊的 PNG 块除外。

        3. 如果您想获得原始数据的精确副本(可能是在缩略图之后保存文件,或者对其进行 SHA1 处理),那么您需要单独保留它。你可能会这样做:

          var image:UIImage
          var imageData:NSData {
              didSet {
                  image = UIImage(data: imageData)
              }
          }
          

        【讨论】:

          【解决方案5】:

          只是因为我偶然发现了这个并且我喜欢 swift :)

          这是 Caroiline 帖子的快速翻译。

          var imageData = UIImagePNGRepresentation(image)
          

          或者

          var imageData = UIImageJPEGRepresentation(image, 0.7) 
          

          【讨论】:

          • 问题与 swift 无关。
          【解决方案6】:

          自从给出上述答案后,情况发生了变化,对于那些仍在寻找的人来说,因为他们与 CipherCom 有同样的担忧:iOS 5 添加了CIImage property。

          【讨论】:

          • 我没有看到使用 CIImage 获取底层 NSData 的方法......我错过了什么吗?
          • 这无济于事。属性CIImage 仅在使用imageWithCIImage: 初始化时才设置。这也不是直接使用的数据,而是另一个图像表示对象。
          【解决方案7】:
          NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality
          

          或

          NSData *imageData = UIImagePNGRepresentation(image);
          

          取决于您是否需要 PNG 格式或 JPG 格式的数据。

          【讨论】:

          • 我不知道为什么这个答案被投票这么多次,也不被接受。 OP 要求检索最初给出的数据。使用UIImageJPEGRepresentation 或UIImagePNGRepresentation 将更改数据并进行重新转换。有什么方法可以真正实现所要求的吗?
          • 这个答案不好,因为如果图像已经是有损格式,它会降低图像的质量。
          • @CipherCom 我明白你在说想要返回确切的数据。但是,我认为对于遇到问题的大多数人来说,这个答案将非常适合他们的需求......因此得到了支持。如果您遇到获取原始数据的答案,请分享;)
          • @1dayitwillmake 即使是 PNG 代表?不是我的专业领域,但我认为 PNG 不会遭受损失?
          • @Bob Spryn 这无济于事。属性 CIImage 仅在使用 imageWithCIImage: 初始化时才设置。这也不是直接使用的数据,而是另一个图像表示对象。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-09
          • 2018-04-08
          相关资源
          最近更新 更多