2012-06-17 11 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]; 

Ho un file jpeg, posso confermare che il contenuto URL viene raccolto con successo, ma quando provo a mettere i miei dati immagine nella UIImage mia app non riesce . Mi chiedo se ci sia qualche controllo per NSData per confermare che sia utilizzabile per UIImage.Come verificare se un NSData è valida per l'utilizzo in UIImage

Inoltre, non so cosa causa questo errore e come prevenirlo. Qualsiasi aiuto sarebbe apprezzato.

+0

È possibile verificare se il valore restituito dal costruttore statico UIImage è 'nil' o non vedere se i dati possono realmente essere utilizzati come immagine. Per quanto riguarda il motivo per cui fallisce, ci sono troppe informazioni per indovinarne il motivo. Puoi pubblicare il log per la stampa di NSData ricevuto? – nhahtdh

+0

i dati dell'immagine sono danneggiati, come può essere controllato se può essere utilizzato come immagine e perché non può essere utilizzato in questo caso? – Bartu

+0

Penso di aver risposto a queste 2 tue domande nel mio commento. – nhahtdh

risposta

23

Come indicato in the documentation imageWithData: restituisce nil se UIImage non è in grado di creare un'immagine dai dati. Il modo corretto di gestirlo in fase di runtime consiste nel fornire un'immagine segnaposto quando tale metodo restituisce zero.

Per quanto riguarda la diagnostica, prima di guardare i messaggi della console, a volte forniscono informazioni utili. In caso contrario, la tua migliore fortuna è quella di scaricare NSData su disco e confrontare il risultato con il file memorizzato sul server. A volte ottieni dati corrotti, a volte ricevi un messaggio di errore html in cui ti aspettavi i dati binari jpeg.

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

provare questo, questo controllerebbe se nsdata è vuoto o no.

+4

sì, ma non era questa la domanda. – katzenhut

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

È possibile utilizzare

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

dare una prova ...

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

} 

Niente ha funzionato nel mio caso oltre a questo.

2

Per Swift provare questo,

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

Se hai a che fare con una sola immagine piccola, è possibile convertire Data a un UIImage:

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

Ma se hai a che fare con numerose immagini o immagini ad alta definizione, è possibile utilizzare ciò che viene chiamato The magic bytes in tutti i file, ovvero i primi pochi byte che rappresentano una firma di file.

In pratica dovrai solo estrarre alcuni byte anziché assegnare un'intera immagine.

Ecco un Data estensione utilizzando questa tecnica:

importazione Fondazione

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

È possibile aggiungere altre immagini o immaginare un riconoscimento tipo di file in base a che i tipi di codice e di file (see Wikipedia list of file signatures per esempio).

Problemi correlati