#encoding:utf-8
'''
该代码主要用来处理从网上爬虫下来的损坏图片,以及批量裁剪图片
'''
from PIL import Image
import cv2
import os
'''------------ start 检测图像文件是否损坏 ---------------- '''
def is_valid_image(path):
try:
bValid=True
fileobj=open(path,'rb') #以二进制打开文件
buf=fileobj.read()
if not buf.startswith(b'\xff\xd8'): # 是否以\xff\xd8开头 表示JPEG(jpg)
bValid=False
else:
try:
Image.open(fileobj).verify()
except Exception as e:
bValid=False
except Exception as e:
return False
return bValid
''' ----- 这里写一个调用函数:调用is_valid_image -----------'''
def is_call_valid(path):
# 遍历图像夹下所有图像 root:根目录 dirs:根目录下所有目录(文件夹):files: 包含所有图像的一个list
for root,dirs,files in os.walk(path):
for img_file in files:
# 组合图像的绝对路径
img_file_path=os.path.join(root,img_file)
# 调用图像判断函数
flag=is_valid_image(img_file_path)
# 判断图像是否损坏,若是则删除
if flag==False:
os.remove(img_file_path)
# print(img_file_path)
''' --------- start 批量裁剪图片为指定大小 -------------'''
def cutimage(path,suffix):
for root,dirs,files in os.walk(path):
for file in files:
filepath = os.path.join(root, file)
filesuffix = os.path.splitext(filepath)[1][1:]
# print(filesuffix)
if filesuffix in suffix: #遍历找到指定后缀的文件名["jpg",png]等
image = cv2.imread(filepath) #opencv剪切图片
# cv2.imshow(file,image)
dim =(500,375) #指定尺寸w*h
resized =cv2.resize(image,dim,interpolation = cv2.INTER_AREA) #这里采用的插值法是INTER_LINEAR
# cv2.imshow("resize:%s"%file,resized)
cv2.imwrite("../cv/%s"%file,resized) #保存文件
cv2.waitKey(0) #退出
suffix = ["jpeg"]
if __name__ == "__main__":
# 图像文件夹路径 根据自己电脑修改路径
path=r'./chinese_celeb_imgs/'
# 调用is_call_valid函数 删除损坏的图像文件
is_call_valid(path)
# 批量裁剪图片
# cutimage(path,suffix)