web-dev-qa-db-fra.com

UIImage vers NSData pour les données de base dans Swift 3.0

Donc auparavant, dans Swift 2.2 je pouvais utiliser Entity.image = UIImagePNGRepresentation(UIImage(named: "Image Name")!)

Mais maintenant, dans Swift 3.0, il semble que nous devons maintenant utiliser une étape supplémentaire. Entity.image = NSData(data: UIImagePNGRepresentation(UIImage(named: "Image Name")!)) Ou l'équivalent objet de UIImage(name: "Image Name")

Existe-t-il une nouvelle méthode dans Swift 3.0 pour passer de UIImage à NSData?

11
Jason Brady

Essaye ça:

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

Pour une exécution sécurisée du code, utilisez le bloc if-let avec Data, comme la fonction UIImagePNGRepresentation le renvoie, valeur facultative.

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

Remarque: Les données est Swift 3 classe. Utilisez Data au lieu de NSData avec Swift 3

Opérations d'image génériques (comme png et jpg les deux):

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...
}

En utilisant l'extension:

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...
}
7
Krunal

Pour Swift 4, c'est beaucoup plus facile:

let imageData = image.jpegData(compressionQuality: 0)

Bien sûr, la qualité de la compression est une variable que vous définissez. 0 pour la plus grande compression et 1 pour la moindre compression.

3
blackpepper

L'utilisation de UIImagePNGRepresentation pour convertir UIImage en Data peut parfois entraîner des images déformées lorsque vous reconvertissez les données, car certaines métadonnées essentielles sont supprimées des données d'origine lors de la conversion initiale.

Après quelques recherches, je me suis retrouvé avec le code suivant pour convertir UIImage en 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)
}
1
Ely

Utilisez l'image PNG ou JPG comme données.

Pour PNG self.imgProfilePic.image! .PngData ()

Pour JPEG self.imgProfilePic.image! .JpegData (compressionQuality: 1.0) // Qualité min = 0,0 à max = 1,0

0