Wen Chen
Published on

用python批次將圖片轉檔成webp並壓縮

Authors
  • avatar
    Name
    Wen Chen

前言

最近開始寫部落格後,因為部落格大部分文章內照片都是自己用相機拍的,而相機拍出來的照片每張動輒好幾 MB,那肯定是不行的麻。

過去可能會在用 Lr 修完色後壓縮輸出又或是透過 tinyPNG來壓縮檔案,但總覺得程序還是有點繁瑣。

剛好從以前就很常在網上看到,「WebP的優點」相關文章,還不了解WebP者可以自行搜尋下,網上很多文章講得很詳細,這裡就不細說了,但過去看歸看,實際上公司專案大多還是使用 pngjpg 居多,剛好趁著寫個人 Blog 的機會來試試看使用WebP

於是花了一點時間找到透過 python 批次轉黨的方式,並依照自己需求改成了堪用的方式。

本文參考來源:https://ithelp.ithome.com.tw/articles/10287388

更詳細的 python 使用建議翻閱原文,不過本文底下會直接提供目前我在使用的版本,有需要的直接 clone 下來就可以用了。


作法

作法很簡單,只有用到 globPillow,所以只需要另外再安裝 Pillow 就好

pip install Pillow

接下來和原文內容差不多,只有做一些修改符合需求:

  1. 抓取資料
import glob
from PIL import Image

# 從專案裡的 raw 資料夾取出 jpg 與 png 類型檔案
jpg = glob.glob('./raw/*.[jJ][pP][gG]') # 不論大小寫的 jpg 檔案
png = glob.glob('./raw/*.[pP][nN][gG]')
  1. 執行轉檔並儲存
import glob
from PIL import Image

# 從專案裡的 raw 資料夾取出 jpg 與 png 類型檔案
jpg = glob.glob('./raw/*.[jJ][pP][gG]') # 不論大小寫的 jpg 檔案
png = glob.glob('./raw/*.[pP][nN][gG]')

for i in jpg:
    print(i)
    im = Image.open(i)
    name = i.lower().split('/')[::-1][0]
    webp = name.replace('jpg', 'webp') # 置換黨名
    # 儲存成 webp 檔案到專案裡的 converted 資料夾
    im.save(f'./converted/{webp}', 'WebP', quality=40, )

for i in png:  # png 類型檔案也執行一次
    print(i)
    im = Image.open(i)
    name = i.lower().split('/')[::-1][0]
    webp = name.replace('png', 'webp')
    im.save(f'./converted/{webp}', 'WebP', quality=40, )

質量設定

先解釋下最後的

# 官方文件:
Image.save(fp, format=None, **params)

im.save(f'./converted/{webp}', 'WebP', quality=40, )

第一個 param 是 filePath,檔案儲存的路徑,第二個是 format,這個其實可以不用填的,假如沒有填的話預設會抓副檔名的 format ,剩下的都是該 formatoptions

圖片的大小與壓縮量透過 quality 設定,因為我相片本身圖片原始質量都很大,所以 quality 只給 40,這部分可以根據自己需求調整

不同檔案類型在 save() 時給的options並不盡相同,底下會介紹儲存為 WebP 時比較重要的options

如果是要轉存成 Jpeg 的話剛好有看到一篇文章不錯,可以參考: https://jdhao.github.io/2019/07/20/pil_jpeg_image_quality/

Webp save Options:

  1. lossless : 默認有損壓縮,若給 True 則使用無損壓縮
  2. quality : 默認是 80。有損壓縮時,指的是圖片的尺寸,100最大; 無損壓縮則是指壓縮工作量,0最快、100最慢檔案最大,但最好。
  3. method : 速度/品質權衡,(0=fast, 6=slower-better),預設為 4。

其餘 Options 可以看這裡:https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#webp-saving

就醬...很簡單,這裡說明一下,因為我的使用需求,所以我在專案資料夾底下分別創了 rawconverted 資料夾,原始丟進 raw,轉完去 converted 取,簡單無腦。

後記

目前絕大多數 Blog 內使用到的圖片,都是用這方法轉成 WebP 使用,而檔案大小確實也差了很多,圖片品質也不差,提供給有需要的人囉!

完整Github連結

本身不太會寫 Python,如果內容有誤,或是有更好的寫法再麻煩各位提點了XD