#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)