Swift 3.0中将UIImage转换为NSData用于Core Data

11
之前在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的新方法?
6个回答

33

试一试:

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

完成了。我觉得有趣的是,当我使用as!或as?时它不起作用。它告诉我从Data?到NSData的强制转换总是失败的。我很好奇为什么它能够像NSData?一样工作。 - Jason Brady
1
如果您不关心它的类型,只想要它的原始数据表示,该怎么办? - Þorvaldur Rúnarsson
它告诉我Core Data期望Data而不是NSData。 - user5306470

7

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

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

注意:Data是Swift 3类。在Swift 3中请使用Data而不是NSData。

通用的图像操作(如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表示最小压缩。


2
另外,您还有photo.pngData()。 - Guilherme Carvalho

1

使用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)
}

0

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

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

对于 JPEG self.imgProfilePic.image!.jpegData(compressionQuality: 1.0) // 质量最小值 = 0.0,最大值 = 1.0


-1

使用作为扩展来获取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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接