「生活可以更简单, 欢迎来到我的开源世界」
  1. 出现这种问题的原因是什么呢?
  2. 如何检测错误图片呢?
  3. 检测不完整图片代码
  4. 检测某个文件夹下不完整的图片,并删除
(转载)Python检测下载不完整的JPG、JPEG、PNG图片
2020-12-11

原文: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()
<⇧>