批次圖片轉檔 ( jpg、png、gif、pdf...等 )
這篇文章會介紹使用 Python 的 glob 標準函式庫,搭配 Pillow 第三方函式庫,實作可以一次將大量的圖片,批次轉檔的功能 ( jpg 轉 png、png 轉 pdf、jpg 轉 gif...等 ),轉檔過程中,也可以透過調整參數,實現批次壓縮 jpg 的效果。
- 本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
- 使用 Colab 操作需要連動 Google 雲端硬碟,請參考:連動 Google Drive
安裝 Pillow
輸入下列指令安裝 Pillow,根據個人環境使用 pip 或 pip3,如果使用 Colab 或 Anaconda Jupyter,已經內建 Pillow 函式庫。
!pip install Pillow
使用 glob 取得所有檔案的原始名稱
程式裡可以先使用 glob 標準函式庫,執行後就會讀取 demo 資料夾裡所有的 jpg 檔案 ( 範例 demo 資料夾內有一些需要轉檔的 jpg 圖片 )。
參考:查找匹配檔案 glob
import glob
# import os
# os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
jpg = glob.glob('./demo/*.[jJ][pP][gG]') # 使用 [jJ][pP][gG] 萬用字元,抓出副檔名不論大小寫的 jpg 檔案
print(images)
'''
['./demo/pic-001.jpg', './demo/pic-002.jpg', './demo/pic-003.jpg',
'./demo/pic-004.jpg', './demo/pic-005.jpg', './demo/pic-006.jpg',
'./demo/pic-007.jpg', './demo/pic-008.jpg', './demo/pic-009.jpg',
'./demo/pic-010.jpg']
'''
使用 Pillow 轉換檔案格式
修改上方的程式,import PIL 裡的 Image 方法,使用 Image 開啟檔案,並在存檔時指定副檔名,搭配 for 迴圈,執行後就會將 jpg 檔案批次轉換成 png 的檔案。
PIL 支援 jpg、png、gif、pdf、tiff、bmp、webp...等多種常見圖片格式。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
import glob
from PIL import Image
jpg = glob.glob('./demo/*.[jJ][pP][gG]')
print(jpg)
for i in jpg:
print(i)
im = Image.open(i) # 開啟圖片檔案
name = i.lower().split('/')[::-1][0] # 將檔名換成小寫 ( 避免 JPG 與 jpg 干擾 )
png = name.replace('jpg','png') # 取出圖片檔名,將 jpg 換成 png
im.save(f'./demo/png/{png}', 'png') # 轉換成 png 並存檔
批次壓縮 jpg 圖片
如果是轉換為 jpg,可以額外設定 quality 和 subsampling 參數。
參數 | 範圍 | 說明 |
---|---|---|
quality | 0~100 | 壓縮品質,100 畫質最好 ( 檔案最大 ),0 畫質最差 ( 檔案最小 ),預設 75。 |
subsampling | 0、1、2 | 二次採樣,預設 0。 |
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
import glob
from PIL import Image
jpg = glob.glob('./demo/*.[jJ][pP][gG]')
print(jpg)
for i in jpg:
print(i)
im = Image.open(i) # 開啟圖片檔案
name = i.split('/')[::-1][0] # 取出檔名
im.save(f'./demo/jpg/{name}', quality=65, subsampling=0) # 設定參數並存檔
小結
過去要處理大量圖片轉檔或壓縮,可能都要開啟影像處理軟體,透過 Python,面對大量圖片的轉檔作業,也能夠輕鬆處理了。
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~