Python 圖片批次處理:Pillow 一鍵壓縮、加水印、轉格式

做網店、做市場推廣嘅朋友,一定試過呢個情景:影咗或者收到幾百張產品相,要逐張改做同一個尺寸、壓縮到唔超過某個容量、再加個公司水印,最後轉做網頁用嘅格式。用修圖軟件一張一張開、一張一張改、一張一張另存,做十張都仲忍得住,做到第一百張就想收工。

其實呢類「同一套動作、重複幾百次」嘅工序,正正就係電腦最擅長嘅事。用 Python 嘅圖片處理套件 Pillow,寫大約二十行嘅程式,就可以將成個資料夾嘅圖一次過處理好,你去沖杯咖啡返嚟已經搞掂。

Pillow 係咩?點解要學?

Pillow 係 Python 最常用嘅圖片處理套件(佢個舊名叫 PIL)。佢可以開圖、改尺寸、裁剪、旋轉、調光暗、加文字水印、轉格式、壓縮——基本上修圖軟件日常會用到嘅功能佢都有,而且係免費、開源、完全用程式控制。正因為係用程式控制,所以先可以「批量」:處理一百張圖同時處理一張圖,工序完全一樣,只係多咗一個迴圈。

第一步:安裝 Pillow

打開「命令提示字元」(Windows 搜 cmd),打以下一行就可以:

pip install pillow

裝完之後,你嘅 Python 就已經識得處理圖片,唔使買任何軟件。

第二步:先識三招基本功

所有批次處理,其實都係由三個動作砌出嚟:開圖、改圖、儲存。

from PIL import Image img = Image.open("product.jpg") # 1. 開圖 img = img.resize((800, 800)) # 2. 改尺寸 img.save("product_small.jpg", quality=80) # 3. 儲存(quality 80 = 壓縮)

就係咁簡單。resize() 將圖片改成指定尺寸,save() 入面嘅 quality=80 就係壓縮質素(1 至 100,數字越細,檔案越細)。

第三步:批次處理成個資料夾

單張處理識咗,加個迴圈就變成批量。假設你有個叫 photos 嘅資料夾,想將入面所有圖片統一改成 800×800、壓縮、再存去一個叫 output 嘅新資料夾:

from PIL import Image import os, glob IMG_EXTS = (".jpg", ".jpeg", ".png", ".webp") os.makedirs("output", exist_ok=True) # 輸出資料夾,冇就自動開 count = 0 for path in glob.glob("photos/*"): if not path.lower().endswith(IMG_EXTS): continue # 跳過非圖片檔案 try: with Image.open(path) as img: img = img.convert("RGB") # 統一色彩模式,PNG 都存得做 JPG img = img.resize((800, 800), Image.LANCZOS) # 高質素縮圖 name = os.path.splitext(os.path.basename(path))[0] img.save(os.path.join("output", name + ".jpg"), quality=80, optimize=True) count += 1 except Exception as e: print("跳過", path, e) # 壞檔唔會令成個程式停低 print("搞掂!共處理", count, "張圖")

逐行解釋

  • glob.glob("photos/*") —— 一次過拎晒資料夾入面所有檔案,唔使自己數。
  • path.lower().endswith(IMG_EXTS) —— 只揀圖片,遇到 Excel、PDF 或者隱藏檔就自動跳過,唔會撞板。
  • convert("RGB") —— 將圖片轉做標準 RGB 色彩;有啲 PNG 帶透明通道,唔轉嘅話儲存做 JPG 會直接報錯。
  • resize(..., Image.LANCZOS) —— 指定用最高質素嘅縮圖演算法,縮完唔會起格。
  • try / except —— 就算有一兩張圖壞咗,程式都會繼續做落去,唔會中途死機白做。
  • optimize=True —— 叫 Pillow 額外壓一壓,通常再細幾個百分比,免費嘅。

加公司水印

加浮水印嘅原理,其實係「將一張細細嘅 logo 貼上大圖上面」。先準備一張透明底嘅 logo(PNG 格式),然後:

from PIL import Image base = Image.open("photos/a.jpg").convert("RGB") logo = Image.open("logo.png").convert("RGBA") # 透明底 logo # 將 logo 縮到闊度佔大圖 15% w = int(base.width * 0.15) logo = logo.resize((w, int(logo.height * w / logo.width))) # 貼落右下角(留 20px 邊) pos = (base.width - logo.width - 20, base.height - logo.height - 20) base.paste(logo, pos, logo) # 第三個參數 = 用 logo 嘅透明通道做遮罩 base.save("a_watermark.jpg", quality=85)

留意 paste() 嘅第三個參數:一定要傳入 logo 本身做遮罩,透明嘅部分先會透返底圖出嚟,否則會出現一個白色方框,非常礙眼。

轉 WebP:網站載入快幾成

如果你係做網站,將相片轉做 WebP 格式,通常可以比 JPG 細三成,但肉眼睇落差唔多,網頁自然載入快啲。改法好簡單,淨係改儲存嘅檔名同格式:

img.save("output/a.webp", format="WEBP", quality=80)

Pillow 會按檔名自動轉格式,唔使額外安裝任何嘢,亦唔使逐張上網轉檔。

五個實戰貼士

  • 先備份原圖 —— 程式永遠輸出到新資料夾,唔好直接覆蓋原檔;試錯空間大好多,出事都唔怕。
  • 記住「長邊」概念 —— 產品相闊高比例唔同,硬改做正方形會拉長變形。想保持比例,就只縮長邊,或者先裁成正方形。
  • 手機相會上下顛倒 —— 手機相片帶有旋轉資訊(EXIF),加一行 ImageOps.exif_transpose(img) 就可以擺正,唔會出現打橫嘅相。
  • 質素由 80 試起 —— JPG quality 80 通常肉眼睇唔出同 100 有分別,但檔案細一半;低過 70 就開始起「格仔」。所以唔好一開始就開到 100。
  • 快到你唔信 —— Pillow 處理一張 800px 圖只需十幾毫秒,一千張都係講緊幾十秒,絕對快過人手逐張做。

總結

Python 教學:本文由最簡單嘅開圖、改尺寸、儲存三招開始,一路示範到批次處理成個資料夾、加公司水印,同埋轉 WebP 慳位。核心心法只有一句:搵出你重複做嘅工序,交俾 Python 用迴圈一次過做晒。下次再遇到「幾百張圖要統一處理」嘅工作,唔好再逐張開修圖軟件——寫廿行 code,設好參數,跑一次,之後每個月都可以循環再用。