16
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.

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

4

8 回答 8

26

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

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

于 2012-06-17T15:52:35.110 回答
4

您可以使用

 if ([UIImage imageWithData:yourNSData]) {
     // there was an image
 }
于 2015-04-16T19:55:44.793 回答
4

对于Swift试试这个,

if let image = UIImage(data: yourNSData){
   YourImageView.image = image
}
于 2016-02-11T21:59:26.730 回答
3

如果您正在处理单个小图像,则可以转换DataUIImage

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

但是,如果您要处理大量图像或高清图像,则可以使用The magic bytes所有文件中的名称,即表示文件签名的前几个字节。

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

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

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

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

于 2017-08-18T13:44:32.310 回答
1

在斯威夫特 4.2

self.userImageView.image = UIImage(data: data) != nil ? UIImage(data: data) : UIImage.init(named: "YourDesiredImage")
于 2018-10-25T11:49:44.973 回答
0

试试这个...

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

}

除此之外,在我的情况下没有任何效果。

于 2015-08-28T08:54:21.837 回答
-1
if (tdata !=(NSData *)nil){ 
    NSlog(@"Valid");
}
于 2012-06-18T07:56:24.413 回答
-2
if (tdata !=nil){ 
    NSlog(@"Valid");
}

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

于 2012-06-18T06:53:51.180 回答