用python判断图片是否损坏
2017-04-22python
起因
要下载几千张图片,是 jpg 格式的,下下来之后才发现有部分图片
预览不了,显示损坏了。损坏的图片有的只有几个字节,有的和正常图片
有差不多的大小,所以不能根据文件大小来区分。
解决
根据文件头
python 标准库里面有个叫 imghdr 的模块,打开它的源代码
可以看到它是根据文件前面几个字节来判断是哪种格式。所以不行,有些图片有文件头,但是后面缺失了数据,它是无法判断的。
根据文件结束符
网上有说 jpg 尾部是 ff d9 , 我根据它来判断,还是不行,有一部分损坏的图片,它是有结束符的。
用PIL
网上有说用 pil 里面 image 的 verify() 来判断,还是不行,去看了下它的代码,它主要针对的是 png 格式的。后来有人说用
load() , 试了下可以。代码如下:
from PIL import Image
def is_valid_image(filename):
valid = True
try:
Image.open(filename).load()
except OSError:
valid = False
return valid
总结
要多读好的代码,比如说 imghdr 这是标准库里面的模块,以前从来没听说过,也没去看过它。它的代码很短,也很简单,很适合我们新手学习。
比去网上看别人的文章还要好。网上充满了千篇一律的东西,我们应该好好的看一看标准库里面的代码。先挑简单的来,在慢慢看大一点,复杂一点的模块。学 python 这么久还是新手,主要就是不会思考,不会学习。
在这里我以过来人的身份给大家的忠告是:要读标准库里的源代码。