- Published on
用python批次將圖片轉檔成webp並壓縮
- Authors
- Name
- Wen Chen
前言
最近開始寫部落格後,因為部落格大部分文章內照片都是自己用相機拍的,而相機拍出來的照片每張動輒好幾 MB,那肯定是不行的麻。
過去可能會在用 Lr 修完色後壓縮輸出又或是透過 tinyPNG來壓縮檔案,但總覺得程序還是有點繁瑣。
剛好從以前就很常在網上看到,「WebP的優點」相關文章,還不了解WebP
者可以自行搜尋下,網上很多文章講得很詳細,這裡就不細說了,但過去看歸看,實際上公司專案大多還是使用 png
與 jpg
居多,剛好趁著寫個人 Blog 的機會來試試看使用WebP
於是花了一點時間找到透過 python 批次轉黨的方式,並依照自己需求改成了堪用的方式。
本文參考來源:https://ithelp.ithome.com.tw/articles/10287388
更詳細的 python 使用建議翻閱原文,不過本文底下會直接提供目前我在使用的版本,有需要的直接 clone 下來就可以用了。
作法
作法很簡單,只有用到 glob
和 Pillow,所以只需要另外再安裝 Pillow 就好
pip install Pillow
接下來和原文內容差不多,只有做一些修改符合需求:
- 抓取資料
import glob
from PIL import Image
# 從專案裡的 raw 資料夾取出 jpg 與 png 類型檔案
jpg = glob.glob('./raw/*.[jJ][pP][gG]') # 不論大小寫的 jpg 檔案
png = glob.glob('./raw/*.[pP][nN][gG]')
- 執行轉檔並儲存
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 ,剩下的都是該 format
的 options
圖片的大小與壓縮量透過 quality
設定,因為我相片本身圖片原始質量都很大,所以 quality
只給 40,這部分可以根據自己需求調整
不同檔案類型在 save()
時給的options
並不盡相同,底下會介紹儲存為 WebP
時比較重要的options
。
如果是要轉存成
Jpeg
的話剛好有看到一篇文章不錯,可以參考: https://jdhao.github.io/2019/07/20/pil_jpeg_image_quality/
Webp
save Options:
lossless
: 默認有損壓縮,若給True
則使用無損壓縮quality
: 默認是 80。有損壓縮時,指的是圖片的尺寸,100最大; 無損壓縮則是指壓縮工作量,0最快、100最慢檔案最大,但最好。method
: 速度/品質權衡,(0=fast, 6=slower-better),預設為 4。
其餘 Options 可以看這裡:https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#webp-saving
就醬...很簡單,這裡說明一下,因為我的使用需求,所以我在專案資料夾底下分別創了 raw
和 converted
資料夾,原始丟進 raw
,轉完去 converted
取,簡單無腦。
後記
目前絕大多數 Blog 內使用到的圖片,都是用這方法轉成 WebP 使用,而檔案大小確實也差了很多,圖片品質也不差,提供給有需要的人囉!
本身不太會寫 Python,如果內容有誤,或是有更好的寫法再麻煩各位提點了XD