2012-06-17 10 views
15
NSError *error = nil; 
NSURL *url = [NSURL URLWithString:[imageLinks objectAtIndex:0]]; 
NSData *tdata = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached error:&error]; 
if (error) { 
    NSLog(@"%@", [error localizedDescription]); 
}else { 
    // no error, this one is being called within my app 
    NSLog(@"Data loaded successfully"); 
} 
self.pictureView1.image = [UIImage imageWithData:tdata]; 

Tengo un archivo JPEG, puedo confirmar que el contenido de URL se reunió con éxito, pero cuando trato de poner mis datos de imagen en la UIImage mi aplicación falla . Me pregunto si hay algún cheque para que NSData confirme que se puede usar para UIImage.Cómo comprobar si un NSData es válido para su uso en UIImage

Tampoco sé qué causa esta falla y cómo prevenirla. Cualquier ayuda sería apreciada.

+0

Puede verificar si el valor de retorno del constructor estático UIImage es 'nil' o no para ver si los datos realmente se pueden usar como imagen. En cuanto a por qué falla, hay muy poca información para siquiera adivinar el motivo. ¿Puedes publicar el registro para imprimir NSData recibido? – nhahtdh

+0

los datos de imagen están dañados, ¿cómo se puede verificar si se puede usar como imagen y por qué no se puede usar si es así? – Bartu

+0

Creo que respondí estas 2 preguntas tuyas en mi comentario. – nhahtdh

Respuesta

23

Como se indicó in the documentation imageWithData: devuelve nil si UIImage no pudo crear una imagen a partir de los datos. La forma correcta de manejar esto en tiempo de ejecución es proporcionar una imagen de marcador de posición cuando ese método devuelve nulo.

En cuanto al diagnóstico, primero mire los mensajes de la consola, a veces brindan información útil. Si no, su mejor suerte es volcar el NSData en el disco y comparar el resultado con el archivo almacenado en el servidor. A veces obtienes datos dañados, a veces recibes un mensaje de error html donde esperabas datos binarios jpeg.

-1
if (tdata !=nil){ 
    NSlog(@"Valid"); 
} 

prueba esto, esto comprobaría si nsdata está vacío o no.

+4

sí, sí, pero esa no era la pregunta. – katzenhut

0
if (tdata !=(NSData *)nil){ 
    NSlog(@"Valid"); 
} 
4

Puede utilizar

if ([UIImage imageWithData:yourNSData]) { 
    // there was an image 
} 
0

seguirlo ...

if ((dataImage != NULL) && ![v isKindOfClass:[NSNull class]]) 
{ 

} 

Nada funcionó en mi caso además de esto.

2

Para Swift probar esto,

if let image = UIImage(data: yourNSData){ 
    YourImageView.image = image 
} 
0

Si usted está tratando con una sola imagen pequeña, podría convertir a un DataUIImage:

if let _ = UIImage(data: data) { 
    print("data contains image data") 
} else { 
    print("data does not contain image data") 
} 

Pero si usted está tratando con numerosas imágenes o imágenes de alta definición, puede usar lo que se llama The magic bytes en todos los archivos, es decir, los primeros bytes que representan una firma de archivo.

Básicamente, solo tendrá que extraer unos pocos bytes en lugar de asignar una imagen completa.

Aquí es una extensión Data uso de esta técnica:

Fundación importación

extension Data { 
    var isImageData: Bool { 
     let array = self.withUnsafeBytes { 
      [UInt8](UnsafeBufferPointer(start: $0, count: 10)) 
     } 
     let intervals: [[UInt8]] = [ 
      [0x42, 0x4D], // bmp 
      [0xFF, 0xD8, 0xFF], // jpg 
      [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A], // png 
      [0x00, 0x00, 0x00, 0x0C, 0x6A, 0x50, 0x20, 0x20], // jpeg2000 
      [0x49, 0x49, 0x2A, 0x00], // tiff1 
      [0x4D, 0x4D, 0x00, 0x2A] // tiff2 
     ] 

     for interval in intervals { 
      var image = true 
      for i in 0..<interval.count { 
       if array[i] != interval[i] { 
        image = false 
        break 
       } 
      } 
      if image { return true } 
     } 
     return false 
    } 
} 

Se pueden añadir más imágenes o imaginar cualquier reconocimiento del tipo de archivo en función de ese código y tipos de archivos (see Wikipedia list of file signatures por ejemplo).

Cuestiones relacionadas