NSData to UIImage

Sto cercando di salvare un UIIMage e poi recuperarlo e visualizzarlo. Ho avuto successo salvando un’immagine nel pacchetto, recuperandola da lì e visualizzando. Il mio problema deriva da quando provo a salvare un’immagine su disco (convertendola in NSData), quindi a recuperarla. Converto l’immagine in NSData in questo modo …

NSData* topImageData = UIImageJPEGRepresentation(topImage, 1.0); 

poi lo scrivo sul disco in questo modo …

 [topImageData writeToFile:topPathToFile atomically:NO]; 

poi ho provato a recuperarlo in questo modo …

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

che non restituisce alcuna immagine (la dimensione è zero). quindi ho provato …

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

inutilmente. Quando passo il debugger, vedo che i dati contengono il numero corretto di byte, ma sono confuso sul motivo per cui la mia immagine non viene creata. Mi manca un passaggio? Devo fare qualcosa con NSData prima di convertirmi in un’immagine?

Prova questo codice. Questo ha funzionato per me.

Salvataggio dei dati.

crea il percorso per salvare l’immagine.

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

convertire l’immagine in un object dati e salvarla nel file.

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

recuperare l’immagine salvata

 let newImage = UIImage(contentsOfFile: fileURL.relativePath) 

Crea una visione di immagini e caricala con l’immagine recuperata.

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

Dovresti essere in grado di usare i metodi di class di UIImage

 [UIImage imageWithContentsOfFile:topPathToFile]; 

O

 [UIImage imageWithData:data]; 

Non funzionava?

Spero che questo ti aiuti!

Nel caso in cui questo aiuti qualcuno, da iOS6 abbiamo il metodo imageWithData: scale. Per ottenere un object UII con la scala corretta da un object NSData, utilizzare tale metodo, dichiarando la scala che si utilizza per memorizzare l’immagine originale. Per esempio:

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

Qui, myimage è l’object NSData in cui hai archiviato l’immagine originale. Nell’esempio, ho usato la scala dello schermo. Se usi un’altra scala per l’immagine originale, usa invece quel valore.

Controlla questo: http://www.nixwire.com/getting-uiimage-to-work-with-nscoding-encodewithcoder/ .

Ha esattamente quello che penso sia la soluzione al tuo problema. Non puoi semplicemente creare un’immagine da NSData, anche se questo è ciò che suggerisce il senso comune. Devi usare UIImagePNGRepresentation. Fammi sapere se questo aiuta.

Utilizza il blocco if-let con Data per impedire l’arresto dell’applicazione e l’esecuzione sicura del codice, poiché la funzione UIImagePNGRepresentation restituisce un valore facoltativo.

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

Nota: i dati sono di class Swift 3+. Usa Dati invece di NSData con Swift 3+

Operazioni generiche sulle immagini (come png e jpg entrambi):

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

Utilizzando l’estensione:

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