webentwicklung-frage-antwort-db.com.de

NSData zu UIImage

Ich versuche, ein UIIMage zu speichern, es abzurufen und anzuzeigen. Ich war erfolgreich, indem ich ein Bild im Bundle abspeichere, von dort abrufe und es anzeige. Mein Problem entsteht, wenn ich versuche, ein Image auf der Festplatte zu speichern (in NSData umzuwandeln) und es dann abzurufen. Ich konvertiere das Bild in NSData wie so ... 

NSData* topImageData = UIImageJPEGRepresentation(topImage, 1.0);

dann schreibe ich es so auf die Festplatte ...

[topImageData writeToFile:topPathToFile atomically:NO];

dann habe ich versucht es so zu holen ...

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

das gibt kein Bild zurück (die Größe ist Null). also habe ich es versucht ...

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

umsonst. Wenn ich durch den Debugger schritt, sehe ich, dass Daten die richtige Anzahl von Bytes enthalten, aber ich bin verwirrt, warum mein Image nicht erstellt wird. Verpasse ich einen Schritt? Muss ich vor dem Konvertieren in ein Bild etwas mit NSData machen?

20
bruin

Versuchen Sie diesen Code. Das hat für mich funktioniert.

Speichern der Daten.

erstellen Sie einen Pfad, um das Bild zu speichern.

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

konvertieren Sie das Bild in ein Datenobjekt und speichern Sie es in der Datei.

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

Abrufen des gespeicherten Bildes

let newImage = UIImage(contentsOfFile: fileURL.relativePath)

Erstellen Sie eine Bildansicht und laden Sie sie mit dem abgerufenen Bild.

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

Sie sollten Klassenmethoden von UIImage verwenden können 

[UIImage imageWithContentsOfFile:topPathToFile]; 

OR

[UIImage imageWithData:data];

Hat das nicht funktioniert? 

Hoffe das hilft!

17
Kartik Shah

Für den Fall, dass dies jemandem hilft, haben wir ab iOS6 die imageWithData: scale-Methode. Um aus einem NSData-Objekt einen UIImage mit der richtigen Skalierung zu erhalten, verwenden Sie diese Methode und deklarieren die Skalierung, die Sie zum Speichern des Originalbilds verwenden. Zum Beispiel:

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

Mein Bild ist hier das NSData-Objekt, in dem Sie das Originalbild gespeichert haben. In diesem Beispiel habe ich die Bildschirmskala verwendet. Wenn Sie eine andere Skala für das Originalbild verwenden, verwenden Sie stattdessen diesen Wert.

6
Mikiko Jane

Verwenden Sie den if-let-Block mit Data, um den Absturz der App und die sichere Ausführung von Code zu verhindern, da die Funktion UIImagePNGRepresentation einen optionalen Wert zurückgibt. 

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

Hinweis: Daten ist Swift 3+ Klasse. Verwenden Sie Daten anstelle von NSData mit Swift 3+

Generische Bildoperationen (wie png & jpg beide):

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

Mit der Erweiterung:

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

Schauen Sie sich das an: http://www.nixwire.com/getting-uiimage-to-work-with-nscoding-encodewithcoder/

Es hat genau das, was ich denke, die Lösung für Ihr Problem ist. Sie können nicht einfach ein Bild aus NSData erstellen, auch wenn dies der gesunde Menschenverstand vermuten lässt. Sie müssen UIImagePNGRepresentation verwenden. Lassen Sie mich wissen, ob das hilft.

0
Dylan Gattey