Python/如何用Python寫一個簡易的相片批次轉檔工具?

疫情期間,請務必注意:不隨意脫口罩、落實防疫措施、保持社交距離

身為一名網路圖文創作者,常常需要將其他照片格式轉為JPG並調整照片寬度,搜尋網路上免費的PNG2JPG Converter都有諸多限制,讓我苦惱許久。於是我決定寫一個相片批次轉檔工具,雖然我不是很精通程式語言,但逐步列出做法再針對性的搜尋語法,用Python搭配OpenCV寫一個簡單的批次相片轉檔工具也不是不可能。這個相片批次轉檔工具除了可以大量改變相片檔案類型外,也能夠等比例縮放圖片至想要的大小,在部落格照片的快速處理上有非常大的幫助。如果想直接看完整程式碼的,可以透過目錄的超連結直接跳轉,這篇我會記錄我撰寫的過程,以便之後複習使用。有需要者也可以自行取用。

程式目標設定

  1. 將照片從PNG轉成JPG
  2. 將照片從任意長寬轉成自己設定的長寬
  3. 批次處理
  4. 不影響到原始檔案

撰寫思路

項目 說明 相關語法
輸入設定 圖片所在的資料夾位置 input (str)
檔案類型 input (str)
欲變更成的檔案類型 input (str)
欲修正的圖片寬度 input (int)
檔案偵測 將資料夾內的圖片路徑導入 glob.glob(______)
將圖片的路徑、檔名、類型分離以便處理 glob.glob(______)
建立一個空List []
將圖片的檔名重新依序命名為1,2,3…並放入空List,以便迴圈作批次處理 for
list.append
os.rename
圖片調整 將原始圖片寬度和高度叫出 cv2.imread
img.shape
根據修正的圖片寬度可得與原始圖片寬度之間所差的比例 四則運算
依照比例縮放原始圖片長寬 四則運算
圖片儲存 將修正的圖片重新儲存為欲變更的檔案格式 cv2.imwrite
將圖片檔名被更改為1,2,3…的圖片以舊的檔案名稱覆蓋 os.rename
跳出執行完成通知 print

根據列出的程式,需要確認Anaconda的Python編譯器有安裝cv2、os和glob三種軟體包。

程式效果

執行運算之後,Console視窗會出現輸入提示,依次輸入檔案所在的資料夾路徑、原始檔案格式、欲轉換成的檔案格式,以及想改變成的照片寬度,按下Enter後快速批次處理完畢,跳出修正完成的提示。

注意!檔案路徑不可有中文或特殊符號。

再到實際資料夾查看情況,原本三張PNG照片,經過程式處理後另存了三張調整後的JPG照片,查看照片寬度為輸入值1200px,如此大小和格式放在部落格時更適合閱讀。當然也可以調整其他格式的照片,以及不大的長寬。這樣一個簡單的程式卻非常實用呢!

完整程式碼

import cv2 
import os
import glob

folderpath = input('■資料夾路徑(不可有中文):') + '\\' 
originalformat = str(input('■原檔案格式(大小寫一致): .'))
newformat = str(input('■欲變更檔案格式: .'))
resize_width = int(input('■欲變更檔案整數寬度(px):'))
filepath = glob.glob(folderpath + '*.' + str(originalformat)) 
SLfilelist = [] 

n = 0
for i in filepath:
    SLfilelist.append(os.path.splitext(os.path.basename(filepath[n]))[0]) 
    n = n + 1

n = 0
for i in SLfilelist:
    oldpath = folderpath + SLfilelist[n] + '.' + str(originalformat)  
    newpath = folderpath + str(n + 1) + '.' + str(originalformat)
    os.rename(oldpath, newpath) 
    img = cv2.imread(newpath)
    ratio = img.shape[0] / img.shape[1]
    resize_height = round(resize_width * ratio)
    img_resize = cv2.resize(img, (resize_width, resize_height))
    cv2.imwrite (str(folderpath) + str(newformat) + '_version_' + str(SLfilelist[n]) + '.' + str(newformat), img_resize)
    os.rename(newpath, oldpath)
    n = n + 1

print("\n■修正完成!")

Facebook留言

Wordpress留言 (0)

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。