2

我正在从下面的代码下载多个图像并保存到数据库。但是对于某些图像,我遇到了错误。

错误:ImageIO:PNG 无效距离太远错误:ImageIO:PNG 数据检查不正确

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);                               
dispatch_async(queue, ^{
    NSString *imgStr = [dict  objectForKey:@"image"];                  
    imgStr = [imgStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:imgStr]];
    UIImage *image = [UIImage imageWithData:imgData];

    dispatch_sync(dispatch_get_main_queue(), ^{
       mYImageView.image = image;
    });
});

在此处输入图像描述

如何检查存储的图像是否有效,以便我可以再次下载图像?

4

2 回答 2

9

对于 PNG 图像,检查它们的前两个字节和后两个字节。下面是方法,希望对你有帮助。

谢谢。:)

- (BOOL)isImageValid:(NSData *)data
{
    BOOL val = YES;

    if ([data length] < 4) 
        val = NO;

    const char * bytes = (const char *)[data bytes];

    if (bytes[0] != 0x89 || bytes[1] != 0x50) 
        val = NO;
    if (bytes[[data length] - 2] != 0x60 || 
        bytes[[data length] - 1] != 0x82) 
        val = NO;

    return val;
}
于 2012-10-31T07:15:50.713 回答
0

swati sharma 接受的答案效果很好。这是一个 Swift 扩展,适用于希望在 Swift 中做同样事情的任何人:

extension Data
{
    /// Returns whether or not the data is for a valid PNG file.
    var isValidPNG: Bool
    {
        guard self.count > 4 else { return false }
        
        return self[0] == 0x89 &&
            self[1] == 0x50 &&
            self[self.count - 2] == 0x60 &&
            self[self.count - 1] == 0x82
    }
}
于 2021-02-17T13:48:54.680 回答