web-dev-qa-db-fra.com

NSData à UIImage

J'essaie de sauvegarder un UIIMage, puis de le récupérer et de l'afficher. J'ai réussi à enregistrer une image dans le lot, à la récupérer à partir de là et à l'afficher. Mon problème vient du moment où j'essaie de sauvegarder une image sur un disque (en la convertissant en NSData), puis en la récupérant. Je convertis l'image en NSData comme si ... 

NSData* topImageData = UIImageJPEGRepresentation(topImage, 1.0);

alors je l'écris sur le disque comme si ...

[topImageData writeToFile:topPathToFile atomically:NO];

alors j'ai essayé de le récupérer comme si ...

topSubView.image = [[UIImage alloc] initWithContentsOfFile:topPathToFile];

qui ne renvoie aucune image (la taille est zéro). alors j'ai essayé ...

NSData *data = [[NSData alloc] initWithContentsOfFile:topPathToFile];
topSubView.image = [[UIImage alloc] initWithData:data];

en vain. Lorsque je parcours le débogueur, je constate que les données contiennent le nombre d'octets correct, mais je ne comprends pas pourquoi mon image n'est pas créée. Est-ce que je manque une étape? Dois-je faire quelque chose avec NSData avant de convertir en image?

20
bruin

Essayez ce code. Cela a fonctionné pour moi.

Sauvegarde des données.

créer un chemin pour enregistrer l'image.

let libraryDirectory = NSSearchPathForDirectoriesInDomains(.libraryDirectory,
                                                               .userDomainMask,
                                                               true)[0]
let libraryURL = URL(fileURLWithPath: libraryDirectory, isDirectory: true)
let fileURL = libraryURL.appendingPathComponent("image.data")

convertissez l’image en objet Data et enregistrez-la dans le fichier.

let data = UIImageJPEGRepresentation(myImage, 1.0)
try? data?.write(to: fileURL)

récupération de l'image enregistrée

let newImage = UIImage(contentsOfFile: fileURL.relativePath)

Créez une image view et chargez-la avec l'image récupérée.

let imageView = UIImageView(image: newImage)
self.view.addSubview(imageView)
33
ArunGJ

Vous devriez pouvoir utiliser les méthodes de classe de UIImage 

[UIImage imageWithContentsOfFile:topPathToFile]; 

OR

[UIImage imageWithData:data];

Cela n'a-t-il pas fonctionné? 

J'espère que cela t'aides!

17
Kartik Shah

Juste au cas où cela aiderait quelqu'un, depuis iOS6, nous avons la méthode imageWithData: scale. Pour obtenir un UIImage avec la bonne échelle à partir d'un objet NSData, utilisez cette méthode, en déclarant la balance que vous utilisez pour stocker l'image d'origine. Par exemple:

CGFloat screenScale = [[UIScreen mainScreen] scale];
UIImage *image = [UIImage imageWithData:myimage scale:screenScale];

Ici, myimage est l'objet NSData où vous avez stocké l'image d'origine. Dans l'exemple, j'ai utilisé l'échelle de l'écran. Si vous utilisez une autre échelle pour l'image d'origine, utilisez plutôt cette valeur.

6
Mikiko Jane

Utilisez le bloc if-let avec Data pour éviter toute blocage de l'application et une exécution en toute sécurité du code, car la fonction UIImagePNGRepresentation renvoie une valeur facultative. 

if let img = UIImage(named: "TestImage.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 à la fois):

if let img = UIImage(named: "TestImage.png") {  //UIImage(named: "TestImage.jpg")
        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...
     if let image = UIImage(data: data) {
        // Use image...
     }
}

En utilisant l'extension:

extension UIImage {

    var pngRepresentationData: Data? {
        return UIImagePNGRepresentation(img)
    }

    var jpegRepresentationData: Data? {
        return UIImageJPEGRepresentation(self, 1.0)
    }
}

*******
if let img = UIImage(named: "TestImage.png") {  //UIImage(named: "TestImage.jpg")
      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...
     if let image = UIImage(data: data) {
        // Use image...
     }
}
0
Krunal

Découvrez ceci: http://www.nixwire.com/getting-uiimage-to-work-with-nscoding-encodewithcoder/

Il a exactement ce que je pense que la solution à votre problème est. Vous ne pouvez pas simplement créer une image à partir de NSData, même si c'est ce que suggère le bon sens. Vous devez utiliser UIImagePNGRepresentation. Faites-moi savoir si cela aide.

0
Dylan Gattey