如何检查一个NSData在UIImage中的使用是否有效

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]; 

我有一个JPEG文件,我可以确认URL内容是成功收集,但是当我尝试将我的图像数据放入UIImage我的应用程序失败。 我不知道是否有任何检查NSData确认它是可用的UIImage

我也不知道是什么原因导致这种失败,以及如何防止这种失败。 任何帮助,将不胜感激。

如文档 imageWithData所述:如果UIImage无法从数据创build图像,则返回nil。 在运行时处理此问题的正确方法是在该方法返回nil时提供占位符图像。

至于诊断,首先看看控制台消息,他们有时提供有用的信息。 如果没有,最好的办法是将NSData转储到磁盘,并将结果与​​存储在服务器上的文件进行比较。 你有时会得到损坏的数据,你有时只是得到一个HTML错误消息,你期待jpeg二进制数据。

您可以使用

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

对于Swift试试这个,

 if let image = UIImage(data: yourNSData){ YourImageView.image = image } 
 if (tdata !=(NSData *)nil){ NSlog(@"Valid"); } 

试试这个…

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

除此之外,我的案件没有任何工作。

如果你正在处理一个小图像,你可以将Data转换为UIImage

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

但是如果你处理大量的图像或高清图像,你可以在所有文件中使用所谓The magic bytes ,也就是说,前几个字节代表文件签名。

基本上你只需要提取几个字节,而不是分配一个完整的图像。

这是使用这种技术的Data扩展:

import基金会

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

您可以添加更多的图像或基于该代码和文件types设想任何文件types识别(例如, 请参阅维基百科文件签名列表 )。

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

试试这个,这将检查nsdata是否为空。