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

Tôi có một file jpeg, tôi có thể khẳng định rằng nội dung URL được thu thập thành công, nhưng khi tôi cố gắng để đưa dữ liệu hình ảnh của tôi vào UIImage ứng dụng của tôi không . Tôi tự hỏi nếu có bất kỳ kiểm tra cho NSData để xác nhận nó có thể sử dụng cho UIImage.Làm thế nào để kiểm tra xem một NSData có giá trị sử dụng trong UIImage

Tôi cũng không biết nguyên nhân gây ra lỗi này và cách ngăn chặn sự cố này. Bất kỳ trợ giúp sẽ được đánh giá cao.

+0

Bạn có thể kiểm tra xem giá trị trả về từ hàm tạo U tĩnh có phải là 'nil' hay không để xem dữ liệu thực sự có thể được sử dụng làm hình ảnh hay không. Về lý do tại sao nó không thành công, có quá ít thông tin để thậm chí đoán được lý do. Bạn có thể đăng nhật ký để in ra NSData nhận được không? – nhahtdh

+0

dữ liệu hình ảnh bị hỏng, làm thế nào nó có thể được kiểm tra nếu nó có thể được sử dụng như một hình ảnh, và tại sao nó không thể được sử dụng nếu như vậy? – Bartu

+0

Tôi nghĩ rằng tôi đã trả lời 2 câu hỏi này của bạn trong nhận xét của tôi. – nhahtdh

Trả lời

23

Như đã nêu in the documentation imageWithData: trả về nil nếu UIImage không thể tạo hình ảnh từ dữ liệu. Cách chính xác để xử lý điều này trong thời gian chạy là cung cấp một hình ảnh giữ chỗ khi phương thức đó trả về nil.

Đối với chẩn đoán, trước tiên hãy xem thông báo trên bảng điều khiển, đôi khi chúng cung cấp thông tin hữu ích. Nếu không, may mắn nhất của bạn là đổ NSData vào đĩa và so sánh kết quả với tệp được lưu trữ trên máy chủ. Đôi khi bạn nhận được dữ liệu bị hỏng, đôi khi bạn chỉ nhận được thông báo lỗi html nơi bạn đang mong đợi dữ liệu nhị phân jpeg.

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

hãy thử điều này, điều này sẽ kiểm tra xem liệu nsdata có trống hay không.

+4

vâng, nhưng đó không phải là câu hỏi. – katzenhut

4

Bạn có thể sử dụng

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

này cung cấp cho một thử ...

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

} 

Không có gì làm việc trong trường hợp của tôi bên cạnh này.

2

Đối Swift thử này,

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

Nếu bạn đang làm việc với một hình ảnh nhỏ duy nhất, bạn có thể chuyển đổi Data một UIImage:

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

Nhưng nếu bạn đang làm việc với nhiều hình ảnh hoặc hình ảnh có độ phân giải cao, bạn có thể sử dụng những gì được gọi là The magic bytes trong tất cả các tệp, nghĩa là, một vài byte đầu tiên biểu thị chữ ký tệp.

Về cơ bản, bạn chỉ cần trích xuất một vài byte thay vì cấp phát toàn bộ hình ảnh.

Đây là một phần mở rộng Data sử dụng kỹ thuật này:

nhập khẩu Foundation

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

Bạn có thể thêm hình ảnh hoặc tưởng tượng bất kỳ sự công nhận loại tập tin dựa trên mã và loại tập tin (see Wikipedia list of file signatures ví dụ).

Các vấn đề liên quan