原文:https://www.pianshen.com/article/6042331539/

爬取图片下载到本地的时候,总有一些图片显示不完全

出现这种问题的原因是什么呢?

1、网络问题:网络不稳定,接收到的图片信息不完整。也就是说response有问题; 2、本地磁盘满了:有时候接收到的图片信息完整,但是本地磁盘存不下了,毕竟一个图片也要好几Mb呢。

如何检测错误图片呢?

试了很多方法,一个较好的方法就是判断jpg、jpeg、png文件结尾的标识。

JPG文件结尾标识:\xff\xd9 JPEG文件结尾标识:\xff\xd9 PNG文件结尾标识:\xaeB`\x82

检测不完整图片代码

"""
检测图片完整性
"""


class CheckImage(object):

    def __init__(self, img):
        with open(img, "rb") as f:
            f.seek(-2, 2)
            self.img_text = f.read()
            f.close()

    def check_jpg_jpeg(self):
        """检测jpg图片完整性,完整返回True,不完整返回False"""
        buf = self.img_text
        return buf.endswith(b'\xff\xd9')

    def check_png(self):
        """检测png图片完整性,完整返回True,不完整返回False"""

        buf = self.img_text
        return buf.endswith(b'\xaeB`\x82')

检测某个文件夹下不完整的图片,并删除

"""
检测某个文件夹中不完整的图片,并删除
"""
import os
from CheckImage import CheckImage


class CheckBrockImage(object):
    def __init__(self, train_dir):
        self.train_dir = train_dir
        self.completeFile = 0
        self.incompleteFile = 0

    def get_imgs(self):
        """遍历某个文件夹下的所有图片"""
        for file in os.listdir(self.train_dir):
            if os.path.splitext(file)[1].lower() == '.jpg' or os.path.splitext(file)[1].lower() == ".jpeg":
                ret = self.check_img(file)
                if ret:
                    self.completeFile += 1

                else:
                    self.incompleteFile = self.incompleteFile + 1
                    # self.img_remove(file)  # 删除不完整图片

    def img_remove(self, file):
        """删除图片"""
        os.remove(self.train_dir + file)

    def check_img(self, img_file):
        """检测图片完整性,图片完整返回True,图片不完整返回False"""
        return CheckImage(self.train_dir + img_file).check_jpg_jpeg()

    def run(self):
        """执行文件"""
        self.get_imgs()
        print('不完整图片 : %d' % self.incompleteFile)
        print('完整图片 : %d' % self.completeFile)


if __name__ == '__main__':
    train_dir = 'C:/Users/79993/Desktop/BrockImg/TextImg/'  # 检测文件夹
    imgs = CheckBrockImage(train_dir)
    imgs.run()