如何检查图片是否有效
例如,当我缓存只下载了一半但失败的图像时,此图像无效,那么我想知道它是无效图像并再次下载。 (当我使用损坏的图像时,Xcode控制台会记录一个错误: ImageIO:PNG IDAT:CRC错误)
所以我想找一个检查图片验证的机制 适用于不同种类的JPEG,PNG等
任何人都有一些线索吗?
答案 0 :(得分:5)
我首先检查有效标头。 其次是页脚。通常最后8个字节的uint值按顺序排列 '73,69,78,68,174,66,96,130' 。 这转换为Int64等于5279712195050102914
这应该用于png:)
if(memcmp(img_bytes,“\ 211PNG”,4)!= 0 || OSReadBigInt64(img_bytes,(length - 8))!= 5279712195050102914)
{
//Bad Data! Free your data and return or something
}
答案 1 :(得分:1)
之所以发生这种情况是因为您使用相同的类从服务器下载图像文件,并且您要求后续下载相同的文件,而它已经下载了该文件,这导致先前的一个文件下载失败并导致部分下载文件。
答案 2 :(得分:0)
我建议您获取图片的文件大小&与刚刚下载的图像文件进行比较。
答案 3 :(得分:0)
为了从网络加载图像,有两个明显的失败案例:
对于第一种情况,nil检查各种UIImage方法的返回值可能是处理此错误情况的最佳方法。
如果无法使用提供的数据初始化图片,则UIImage
上的以下类方法将返回nil:+ (UIImage *)imageWithData:(NSData *)data
和+ (UIImage *)imageWithContentsOfFile:(NSString *)path
。
执行nil检查的代码可能如下所示:
UIImage *image = [UIImage imageWithContentsOfFile:pathToImage];
if (image) {
// The image was loaded. Display it
}
else {
// The image was not loaded. Redownload or display a placeholder, etc...
}
对于第二次失败的情况,可能是连接丢失的结果。对于这种情况,最好在NSURLConnection的委托中处理失败。如果在调用- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
时下载图像,则应丢弃请求的数据。
另请注意,不会从服务器调用{4}或5xx响应didFailWithError:
。由于其他原因切断连接时会调用它。当服务器以200 OK响应时,确保只将图像数据写入磁盘通常是个好主意。