如何用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三種軟體包。

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

程式效果

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

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

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

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

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

完整程式碼

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■修正完成!")
Python學習紀錄
Python基礎語法
主題 文章
編譯器與IDE
  • 註解:Comments
  • 模組:pip install.Module
  • 印出:print
  • 資料型態:numbers.string.list.tuples.dictionary
  • 運算:算數運算子.關係運算子.邏輯運算子
  • 判斷式:if else
  • 迴圈:while.for
  • 自定義函數:def
  • 矩陣:Array
  • 迭代器:Iterators
  • 物件導向:類(Classes).物件(Objects).封裝(Encapsulation).繼承(Inheritance).多型(Polymorphism)
  • 讀取儲存:Files I/O
  • 資料儲存:Json
  • 嘗試:Try Except
  • 互動:Input
  • 日期:Date
常用模組
  • Math:數學
  • Numpy:矩陣與線性代數運算
  • Random:隨機數
  • Matplotlib:資料作圖
  • OpenCV:影像資訊處理庫
  • pandas:配合Excel、CSV、Jason等數據處理
影像處理
  • 影像讀取與屬性修改
  • 網路攝影機
網路爬蟲
  • 網站爬蟲:Web Crawler
圖形介面
  • Tkinter:基礎GUI介面
  • Pyside:Qt框架的GUI介面
  • CustomTkinter:基礎GUI介面美化版
  • Eel:結合html、JavaScript、CSS的網頁GUI介面
檔案打包
Python應用學習
主題 文章
影像應用
  • 圖像辨識
  • 肢體追蹤:Google MediaPipe
機器學習
  • 數據讀取
  • 資料預處理
  • 訓練集與測試集
  • 特徵縮放
  • 代入模型
  • 模型訓練與學習率測試
  • 損失函數:均方誤差.二元交叉熵.Scikit-Learn
深度學習
  • Keras
  • PyTorch
  • TensorFlow
語言分析
  • SnowNLP
  • Bert WWM
圖像生成
  • Stable Diffusion
寫一點小工具
小小作品
Python學習資源
常用網站
編輯 ] 筆記 » 程式語言 » Python
Python|HTML|CSS|JavaScript|Blender|Unreal Engine

Facebook留言

Wordpress留言 (0)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *