Contents

相關縮圖伺服器整理

當網站需要處理大量圖片的縮放、裁切和格式轉換時,使用專門的縮圖伺服器(Image Server)是最有效率的解決方案。這篇介紹兩個常見的開源縮圖伺服器:Thumbor 和 Imagor。

為什麼需要縮圖伺服器?

直接在應用程式中處理圖片(使用 ImageMagick、GD 等)的問題:

  • 佔用應用伺服器的 CPU 和記憶體
  • 無法快取處理後的圖片
  • 難以動態調整輸出尺寸

縮圖伺服器的優點:

  • 專門處理圖片,效能最佳化
  • 透過 URL 動態指定尺寸、裁切方式、濾鏡
  • 結合 CDN 快取,同一張圖只處理一次
  • 支援 WebP、AVIF 等現代格式的自動轉換

Thumbor

Thumbor 是由 Globo.com(巴西媒體公司)開發的 Python 開源縮圖伺服器,是業界廣泛使用的成熟方案。

主要功能

  • 智慧裁切:使用臉部辨識和特徵點偵測,自動保留圖片的重要部分
  • URL 簽名:防止未授權的圖片處理請求
  • 多種儲存後端:支援本地檔案、AWS S3、Google Cloud Storage
  • 結果快取:處理過的圖片可以快取到 Redis 或檔案系統

安裝方式

1
2
3
4
5
6
7
8
9
# 使用 pip 安裝
pip install thumbor

# 啟動服務(預設 port 8888)
thumbor

# 使用 Docker
docker run -it -p 8888:8888 ghcr.io/thumbor/thumbor:latest
# 慢的話改 minimalcompact/thumbor:6.7.5

URL 格式

Thumbor 的 URL 結構:

1
http://{host}/{security_key}/{width}x{height}/{image_url}

範例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 調整為 300x200,智慧裁切
http://localhost:8888/unsafe/300x200/smart/https://example.com/photo.jpg

# 只指定寬度(高度等比例縮放)
http://localhost:8888/unsafe/300x0/https://example.com/photo.jpg

# 指定裁切區域
http://localhost:8888/unsafe/10x10:300x200/400x300/https://example.com/photo.jpg

# 套用濾鏡(轉換為 WebP 格式)
http://localhost:8888/unsafe/300x200/filters:format(webp)/https://example.com/photo.jpg

基本設定(thumbor.conf)

1
2
3
4
5
SECURITY_KEY = 'your-secret-key'
MAX_WIDTH = 2000
MAX_HEIGHT = 2000
QUALITY = 80
AUTO_WEBP = True  # 自動轉換為 WebP

Imagor

Imagor 是以 Go 語言實作的縮圖伺服器,設計目標是相容 Thumbor 的 URL 格式,同時提供更高的效能。

Imagor 的優勢

  • Go 語言:天生的並行處理能力,比 Python 版本效能更高
  • 相容 Thumbor URL:可以無痛遷移
  • 使用 libvips:底層使用 libvips 圖片處理庫,速度極快
  • 支援多種格式:JPEG、PNG、GIF、WebP、AVIF、TIFF 等

安裝方式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 使用 Docker(最簡單)
docker run -p 8000:8000 shumc/imagor -imagor-unsafe -imagor-auto-webp

# 設定 S3 作為儲存後端
docker run -p 8000:8000 \
  -e IMAGOR_SECRET=your-secret \
  -e AWS_ACCESS_KEY_ID=xxx \
  -e AWS_SECRET_ACCESS_KEY=yyy \
  -e S3_LOADER_BUCKET=my-images \
  shumc/imagor

URL 格式(與 Thumbor 相容)

1
2
3
4
5
# 調整尺寸
http://localhost:8000/unsafe/300x200/https://example.com/photo.jpg

# 套用濾鏡
http://localhost:8000/unsafe/300x200/filters:format(webp):quality(85)/https://example.com/photo.jpg

Thumbor vs Imagor 比較

特性 Thumbor Imagor
語言 Python Go
效能 中等 高(libvips)
成熟度 高(約 2010 年起) 較新(2022 年起)
Docker 映像大小 較大 較小
Thumbor URL 相容
臉部辨識裁切 ✓(opencv) 部分支援
社群支援 成長中

建議:新專案可以考慮 Imagor(效能更好、Go 生態系),若已有 Thumbor 基礎設施則繼續使用,兩者 URL 格式相容,遷移成本低。

參考資料