2010-02-10 17 views
20

Estoy tratando de guardar un UIIMage y luego recuperarlo y mostrarlo. He tenido éxito al guardar una imagen en el paquete, recuperarla desde allí y mostrarla. Mi problema proviene de cuando intento guardar una imagen en el disco (convirtiéndola a NSData) y luego recuperarla. Puedo convertir la imagen a NSData así ...NSData to UIImage

NSData* topImageData = UIImageJPEGRepresentation(topImage, 1.0); 

entonces escribir en el disco como tal ...

[topImageData writeToFile:topPathToFile atomically:NO]; 

Luego trató de recuperarlo como tal ...

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

que no devuelve ninguna imagen (el tamaño es cero). entonces probé ...

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

en vano. Cuando paso por el depurador, veo que los datos contienen la cantidad correcta de bytes, pero no estoy seguro de por qué no se está creando mi imagen. ¿Me estoy perdiendo un paso? ¿Debo hacer algo con NSData antes de convertir a una imagen?

Respuesta

15

Usted debe ser capaz de utilizar métodos de clase de UIImage

[UIImage imageWithContentsOfFile:topPathToFile]; 

O

[UIImage imageWithData:data]; 

¿Eso no funciona?

Espero que esto ayude!

+0

Gracias por la respuesta, pero me obtuvo el mismo resultado. Todavía no hay imagen. Estoy realmente perplejo en este momento. – bruin

33

Pruebe este código. Esto funcionó para mí.

Guardar los datos.

crear ruta para guardar la imagen.

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

convierten la imagen en un objeto Datos y la guardan en el archivo.

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

recuperar la imagen guardada

let newImage = UIImage(contentsOfFile: fileURL.relativePath) 

Crear una imageview y cargarlo con la imagen recuperada.

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

imagen para NSData funcionó para mí de esa manera: NSData * data = [NSData dataWithData: UIImagePNGRepresentation (myImage)]; – madmax

+0

Este NSData * data = UIImageJPEGRepresentation (myImage, 1.0); Está Mal. – madmax

+4

primero pruebe el código antes de decir que algo está INCORRECTO. – ArunGJ

6

Por si esto ayuda a alguien, desde iOS6 tenemos el método imageWithData: scale. Para obtener un UIImage con la escala correcta de un objeto NSData, use ese método, declarando la escala que usa para almacenar la imagen original.Por ejemplo:

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

Aquí, myimage es el objeto NSData donde almacenó la imagen original. En el ejemplo, utilicé la escala de la pantalla. Si usa otra escala para la imagen original, use ese valor en su lugar.

0

uso si deja-bloque con datos para evitar accidente aplicación & ejecución segura de código, como la función devuelve un valor UIImagePNGRepresentation opcional.

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

Nota: datos es Swift clase 3+. El uso de datos en lugar de NSData con 3+

operaciones imagen genérica rápido (como png jpg & ambos):

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

Mediante el uso de la extensión:

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