2010-02-10 19 views
20

Sto tentando di salvare un UIIMage e quindi 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. Ho convertire l'immagine in NSData in questo modo ...NSData to UIImage

NSData* topImageData = UIImageJPEGRepresentation(topImage, 1.0); 

poi scrivo su disco in questo modo ...

[topImageData writeToFile:topPathToFile atomically:NO]; 

poi ho cercato di recuperarlo in questo modo ...

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

che non restituisce alcuna immagine (la dimensione è zero). Allora 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?

risposta

15

Si dovrebbe essere in grado di utilizzare i metodi della classe di UIImage

[UIImage imageWithContentsOfFile:topPathToFile]; 

O

[UIImage imageWithData:data]; 

ha fatto che non funziona?

Spero che questo aiuti!

+0

Grazie per la risposta, ma ho ha ottenuto lo stesso risultato. Ancora nessuna immagine. Sono davvero stonato in questo momento. L'immagine da – bruin

33

Prova questo codice. Questo ha funzionato per me.

Protezione dei dati.

creare 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 oggetto 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 un ImageView e caricarlo con l'immagine recuperata.

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

a NSData ha funzionato in questo modo: NSData * data = [NSData dataWithData: UIImagePNGRepresentation (myImage)]; – madmax

+0

Questo NSData * data = UIImageJPEGRepresentation (myImage, 1.0); è sbagliato. – madmax

+4

prima prova il codice prima di dire che qualcosa è SBAGLIATO. – ArunGJ

6

Solo nel caso che questo aiuta qualcuno, da iOS6 abbiamo l'imageWithData: metodo di scala. Per ottenere un oggetto UII con la scala corretta da un oggetto NSData, utilizzare tale metodo, dichiarando la scala che si utilizza per memorizzare l'immagine originale.Ad esempio:

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

Qui, myimage è l'oggetto NSData in cui è stata memorizzata l'immagine originale. Nell'esempio, ho usato la scala dello schermo. Se usi un'altra scala per l'immagine originale, usa invece quel valore.

0

Utilizzare il blocco if-let con Dati per impedire l'arresto anomalo dell'applicazione & esecuzione sicura del codice, in quanto 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: dati è Swift 3+ di classe. L'utilizzo dei dati invece di NSData con Swift 3+

operazioni di immagine generici (come png & 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 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... 
    } 
}