如何检查图像在iPhone上是否有效

时间:2011-12-30 02:30:25

标签: iphone javax.imageio

如何检查图片是否有效

例如,当我缓存只下载了一半但失败的图像时,此图像无效,那么我想知道它是无效图像并再次下载。 (当我使用损坏的图像时,Xcode控制台会记录一个错误: ImageIO:PNG IDAT:CRC错误

所以我想找一个检查图片验证的机制 适用于不同种类的JPEG,PNG等

任何人都有一些线索吗?

4 个答案:

答案 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)

为了从网络加载图像,有两个明显的失败案例:

  1. 下载的文件根本不是图像。
  2. 下载的数据仅包含部分图像数据。
  3. 对于第一种情况,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响应时,确保只将图像数据写入磁盘通常是个好主意。