从海量图片中删除损坏图像

用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 这么久还是新手,主要就是不会思考,不会学习。

在这里我以过来人的身份给大家的忠告是:要读标准库里的源代码

转自:https://www.dust8.com/2017/04/22/python-broken-image/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值