Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何检查NSData是否在UIImage中有效使用_Ios_Objective C_Iphone_Uiimageview_Uiimage - Fatal编程技术网

Ios 如何检查NSData是否在UIImage中有效使用

Ios 如何检查NSData是否在UIImage中有效使用,ios,objective-c,iphone,uiimageview,uiimage,Ios,Objective C,Iphone,Uiimageview,Uiimage,我有一个jpeg文件,我可以确认URL内容已成功收集,但当我尝试将图像数据放入UIImage时,我的应用程序失败。我想知道是否有任何NSData检查,以确认它可用于UIImage 我也不知道是什么导致了这种失败,以及如何预防它。任何帮助都将不胜感激。如上所述,imageWithData:如果UIImage无法从数据创建图像,则返回nil。在运行时处理此问题的正确方法是在该方法返回nil时提供占位符图像 至于诊断,首先看看控制台消息,它们有时会提供有用的信息。如果没有,最好将NSData转储到磁盘

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

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

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

至于诊断,首先看看控制台消息,它们有时会提供有用的信息。如果没有,最好将NSData转储到磁盘,并将结果与存储在服务器上的文件进行比较。您有时会收到损坏的数据,有时只会收到一条html错误消息,您希望看到的是jpeg二进制数据

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];
尝试此操作,将检查nsdata是否为空。

您可以使用

if (tdata !=nil){ 
    NSlog(@"Valid");
}
if (tdata !=(NSData *)nil){ 
    NSlog(@"Valid");
}
试试这个

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

在我的情况下,除了这一点,没有任何效果。

对于Swift试试这个

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

}

如果您正在处理单个小图像,则可以将
数据
转换为
UIImage

if let image = UIImage(data: yourNSData){
   YourImageView.image = image
}
但是,如果您处理的是大量图像或高清晰度图像,则可以在所有文件中使用称为
的神奇字节
,即表示文件签名的前几个字节

基本上,您只需要提取几个字节,而不是分配整个图像

下面是使用此技术的
数据
扩展:

if let _ = UIImage(data: data) {
   print("data contains image data")
} else {
   print("data does not contain image data")
}
<代码>导入基础 扩展数据{ 变量isImageData:Bool{ 让数组=self.withUnsafeBytes{ [UInt8](UnsafeBufferPointer(开始:$0,计数:10)) } let间隔:[[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 ] 对于间隔中的间隔{ var image=true 对于Swift 4.2中的0..i

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

您可以检查静态构造函数UIImage的返回值是否为
nil
,以查看数据是否真的可以用作映像。至于失败的原因,信息太少,甚至无法猜测原因。您可以发布日志以打印收到的NSData吗?映像数据已损坏,如何检查是否可以使用d作为图像,如果是,为什么不能使用?我想我在评论中回答了你的这两个问题。数据扩展帮助了我!谢谢!
self.userImageView.image = UIImage(data: data) != nil ? UIImage(data: data) : UIImage.init(named: "YourDesiredImage")