Python Pillow 基礎圖像處理

在 Python 中處理圖片檔案(如縮放、剪裁、浮水印或格式轉換),Pillow 是最輕量級、安裝最簡單且功能強大的選擇。它是早期知名庫 PIL (Python Imaging Library) 的現代分支,目前已成為 Python 開發者在後端伺服器處理圖片上傳與自動處理的標準工具。

安裝

pip install Pillow

基礎入門:載入與預覽

Pillow 的核心是 Image 物件。所有的操作都從開啟一張圖片開始。

from PIL import Image

# 開啟圖片檔案
img = Image.open('nature.jpg')

# 取得基本屬性
print(f"解析度: {img.size}") # (寬, 高)
print(f"格式: {img.format}") # JPEG, PNG 等
print(f"色彩模式: {img.mode}") # RGB, RGBA (含透明度), L (灰階)

# 在系統預設檢視器中開啟 (用於除錯)
img.show()

常見影像處理任務

1. 縮放與縮圖 (Resize vs Thumbnail)

  • resize():強制縮放至指定尺寸,可能會導致比例變形。
  • thumbnail():原地等比例收縮(不會超過指定邊界),常用於生成縮圖。
# 縮放 (需傳入 tuple)
small_img = img.resize((400, 300))

# 生成縮圖 (直接修改原物件)
img.thumbnail((200, 200)) # 若原圖是 1000x800,則會變成 200x160
img.save('nature_thumb.jpg')

2. 剪裁與旋轉 (Crop & Rotate)

剪裁需要提供一個矩形區域:(左, 上, 右, 下)。座標基準 (0,0) 在圖片左上角。

# 剪裁座標
box = (100, 100, 500, 500)
cropped = img.crop(box)

# 旋轉 (正值為逆時針)
# expand=True 會擴大圖片邊框以容納旋轉後的角落,否則會被裁切
rotated = img.rotate(45, expand=True)
rotated.save('rotated.png')

3. 處理透明度與模式轉換

如果你要將 PNG (RGBA) 轉為 JPG (RGB),必須處理透明背景,否則會發生錯誤。

rgba_img = Image.open('logo.png').convert('RGBA')

# 建立一張同樣大小的純白背景圖
background = Image.new('RGB', rgba_img.size, (255, 255, 255))
# 將透明圖貼在背景上
background.paste(rgba_img, (0, 0), rgba_img)
background.save('logo_flat.jpg')

影像濾鏡與增強 (Enhance)

Pillow 提供簡單的濾鏡模組。

from PIL import ImageFilter, ImageEnhance

# 1. 濾鏡效果
blurred = img.filter(ImageFilter.GaussianBlur(5)) # 高斯模糊
sharpened = img.filter(ImageFilter.SHARPEN) # 銳利化

# 2. 顏色增強
# 飽和度增強 (1.0 代表原圖, > 1.0 變鮮豔)
converter = ImageEnhance.Color(img)
vivid_img = converter.enhance(2.0)

# 亮度調整
brightness = ImageEnhance.Brightness(img).enhance(1.5)

文字與繪圖 (ImageDraw)

你可以在圖片上繪製形狀或加入文字內容(如建立浮水印)。

from PIL import ImageDraw, ImageFont

# 建立畫筆物件
draw = ImageDraw.Draw(img)

# 繪製矩形
draw.rectangle([50, 50, 150, 150], outline="red", width=5)

# 加入文字
# 注意:若需中文支援,必須提供中文字型檔 (.ttf) 路徑
try:
    font = ImageFont.truetype("msjh.ttc", 40) # 微軟正黑體
    draw.text((60, 60), "範例浮水印", font=font, fill=(255, 255, 255))
except:
    draw.text((60, 60), "Watermark") # 若字型載入失敗使用預設字體

img.save('watermarked.jpg')

批次處理實戰範例

import os
from PIL import Image

def batch_compress(source_folder, output_folder, quality=80):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    for filename in os.listdir(source_folder):
        if filename.lower().endswith(('.jpg', '.jpeg', '.png')):
            with Image.open(os.path.join(source_folder, filename)) as img:
                # 轉成 RGB (處理可能的 PNG 透明度)
                rgb_img = img.convert('RGB')
                # 儲存並降低檔案大小
                rgb_img.save(os.path.join(output_folder, filename), quality=quality)
                print(f"已處理: {filename}")

batch_compress('./uploads', './optimized')

總結

  • Pillow 對於大多數 Web 開發需求(如生成頭像縮圖、圖片浮水印)已經綽綽有餘。
  • 始終注意圖片的 Mode (RGB, RGBA, L),這是最容易報錯的地方。
  • 圖片座標的原點在左上角
  • 如果需要更高級的專業功能(如邊緣檢測、物件識別、動態追蹤),請改用 OpenCV

掌握 Pillow 後,你就能自動化處理大量的影像素材,這在開發 CMS、電子商務網站或社群平台時是一項不可或缺的技能。