【问题标题】:UIImage to NSData for Core Data in Swift 3.0UIImage 到 NSData 用于 Swift 3.0 中的核心数据
【发布时间】:2017-02-10 21:09:08
【问题描述】:

所以以前,在 Swift 2.2 中我可以使用 Entity.image = UIImagePNGRepresentation(UIImage(named: "Image Name")!)

但现在在 Swift 3.0 中,我们现在似乎必须使用一个额外的步骤。 Entity.image = NSData(data: UIImagePNGRepresentation(UIImage(named: "Image Name")!))UIImage(name: "Image Name") 的等效对象

在 Swift 3.0 中是否有一种从 UIImageNSData 的新方法?

【问题讨论】:

    标签: ios swift3 uiimage ios10 nsdata


    【解决方案1】:

    试试这个:

    if let img = UIImage(named: "hallo.png") {
        let data = UIImagePNGRepresentation(img) as NSData?
    }
    

    【讨论】:

    • 完成了这项工作。我发现有趣的是当我使用 as 时它不起作用!或作为?它告诉我从数据铸造?到 NSData 总是失败。我很好奇为什么它能够像 NSData 一样使用它?
    • 如果你不关心它的类型,你只需要它的原始数据表示
    • 它告诉我 Core Data 需要 Data,而不是 NSData
    • 感谢您的帮助。
    【解决方案2】:

    为了安全执行代码,使用带有数据的 if-let 块,作为函数 UIImagePNGRepresentation 返回的可选值。

    if let img = UIImage(named: "Hello.png") {
        if let data:Data = UIImagePNGRepresentation(img) {
           // Handle operations with data here...         
        }
    }
    

    注意:Data 是 Swift 3 类。使用 Data 而不是 NSData 斯威夫特 3

    通用图像操作(如 png 和 jpg 两者):

    if let img = UIImage(named: "Hello.png") {
            if let data:Data = UIImagePNGRepresentation(img) {
                   handleOperationWithData(data: data)     
            } else if let data:Data = UIImageJPEGRepresentation(img, 1.0) {
                   handleOperationWithData(data: data)     
            }
    }
    
    *******
    func handleOperationWithData(data: Data) {
       // Handle operations with data here...
    }
    

    通过使用扩展:

    extension UIImage {
    
        var pngRepresentationData: Data? {
            return UIImagePNGRepresentation(self)
        }
    
        var jpegRepresentationData: Data? {
            return UIImageJPEGRepresentation(self, 1.0)
        }
    }
    
    *******
    if let img = UIImage(named: "Hello.png") {
          if let data = img.pngRepresentationData {
                  handleOperationWithData(data: data)     
          } else if let data = img.jpegRepresentationData {
                  handleOperationWithData(data: data)     
          }
    }
    
    *******
    func handleOperationWithData(data: Data) {
         // Handle operations with data here...
    }
    

    【讨论】:

      【解决方案3】:

      对于 Swift 4,这要容易得多:

      let imageData = image.jpegData(compressionQuality: 0)
      

      当然,压缩质量是您设置的变量。 0 表示最大压缩,1 表示最小压缩。

      【讨论】:

      • 另外还有 photo.pngData()
      【解决方案4】:

      使用 UIImagePNGRepresentation 将UIImage 转换为Data 有时可能会在转换回数据时导致图像失真,因为在初始转换时会从原始数据中删除一些重要的元数据。

      经过一番研究,我最终得到了以下代码,将UIImage 转换为Data

      let image = UIImage(named: "whatever")
      var data: Data?
      
      if let cgImage = image.cgImage, cgImage.renderingIntent == .defaultIntent {
          data = UIImageJPEGRepresentation(image, 0.8)
      }
      else {
          data = UIImagePNGRepresentation(image)
      }
      

      【讨论】:

        【解决方案5】:

        使用 PNG 或 JPG 图像作为数据。

        对于 PNG self.imgProfilePic.image!.pngData()

        对于 JPEG self.imgProfilePic.image!.jpegData(compressionQuality: 1.0) // 质量 min = 0.0 到 max = 1.0

        【讨论】:

          【解决方案6】:

          用作扩展以获取 PNG 或 JPG 图像数据作为 NSData。

          extension UIImage {
              var jpegRepresentationData: NSData! {
                  return UIImageJPEGRepresentation(self, 1.0)! as NSData   // QUALITY min = 0 / max = 1
              }
              var pngRepresentationData: NSData! {
                  return UIImagePNGRepresentation(self)! as NSData
              }
          }
          
          //use
          imageView.image!.jpegRepresentationData or
          imageView.image!.pngRepresentationData
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多