python處理圖像文件中損壞的圖片以及批量裁剪指定的圖片大小

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章