在网络不好时,可能请求的图片数据不完整,这时候在imageView展示图片时,因为发现PNG图片不完全正确,所以早console里报错,如下:
: ImageIO: PNG IDAT: invalid stored block lengths
但这个不是运行时异常,不知道该怎么捕获,从而进行例如重新请求等操作。求解该怎么做?
真是功夫不负有心人,在各种stackoverflow和google无解之后,我自己读了UIImage、UIImageView以及ImageIO的源码和官方说明,找到了个取巧的办法,你需要写下面两步代码:
1.读取图片数据,然后调用2中的方法进行校验
NSData* data = [NSData dataWithContentsOfFile:imagePath];
2.判断是否为有效的PNG图片,JPG的请使用UIImageJPEGRepresentation方法
/**
(BOOL)isValidPNGByImageData:(NSData*)imageData
{
UIImage* image = [UIImage imageWithData:imageData];
//第一种情况:通过[UIImage imageWithData:data];直接生成图片时,如果image为nil,那么imageData一定是无效的
if (image == nil && imageData != nil) {
return NO;
}
//第二种情况:图片有部分是OK的,但是有部分坏掉了,它将通过第一步校验,那么就要用下面这个方法了。将图片转换成PNG的数据,如果PNG数据能正确生成,那么这个图片就是完整OK的,如果不能,那么说明图片有损坏
NSData* tempData = UIImagePNGRepresentation(image);
if (tempData == nil) {
return NO;
} else {
return YES;
}
}
真是眼泪都留下来了!~
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。