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

Mam plik JPEG, mogę potwierdzić, że zawartość URL są gromadzone pomyślnie, ale gdy próbuję umieścić moje dane obrazu w UIImage moja aplikacja nie . Zastanawiam się, czy jest jakiś czek na NSData, aby potwierdzić, że jest on dostępny dla UIImage.Jak sprawdzić, czy NSData jest ważna do użytku w UIImage

Nie wiem także, co powoduje tę usterkę i jak jej zapobiec. Każda pomoc będzie doceniona.

+0

Można sprawdzić, czy zwracana wartość z konstruktora statycznego UII ma wartość 'nil', czy też nie, aby sprawdzić, czy dane rzeczywiście mogą być użyte jako obraz. Co do tego, dlaczego nie działa, jest zbyt mało informacji, aby odgadnąć przyczynę. Czy możesz opublikować log do drukowania otrzymanych NSData? – nhahtdh

+0

dane obrazu są uszkodzone, jak można je sprawdzić, czy mogą zostać użyte jako obraz i dlaczego nie można ich użyć, jeśli tak? – Bartu

+0

Myślę, że odpowiedziałem na te 2 pytania w moim komentarzu. – nhahtdh

Odpowiedz

23

Jak podano in the documentation imageWithData: zwraca zero, jeśli UIImage nie może utworzyć obrazu z danych. Poprawnym sposobem na obsłużenie tego w czasie wykonywania jest dostarczenie obrazu zastępczego, gdy ta metoda zwraca zero.

Jeśli chodzi o diagnostykę, pierwsze spojrzenie na komunikaty konsoli, czasem dostarczają użytecznych informacji. Jeśli nie, najlepszym rozwiązaniem jest zrzucenie NSData na dysk i porównanie wyniku z plikiem przechowywanym na serwerze. Czasem dostajesz uszkodzone dane, czasami po prostu dostajesz komunikat o błędzie html, w którym oczekiwałeś danych binarnych jpeg.

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

Spróbuj tego, to sprawdzenie, czy nsdata jest pusty, czy nie.

+4

tak, ale to nie było pytanie. – katzenhut

4

Można użyć

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

spróbuj tego ...

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

} 

Nic nie działało w moim przypadku oprócz tego.

2

Dla Swift spróbować,

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

Jeśli masz do czynienia z pojedynczym małym obrazie, można konwertować Data do UIImage:

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

Ale jeśli masz do czynienia z wieloma obrazami lub obrazami o wysokiej rozdzielczości można użyć nazwy "The magic bytes" we wszystkich plikach, to jest pierwszych kilku bajtów reprezentujących sygnaturę pliku.

Zasadniczo wystarczy wyodrębnić kilka bajtów zamiast przydzielić cały obraz.

Oto Data rozszerzenie przy użyciu tej techniki:

import Fundacja

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

Możesz dodać kolejne obrazy lub wyobrazić sobie uznanie typ pliku na podstawie że typy kodów i plików (see Wikipedia list of file signatures na przykład).

Powiązane problemy