影像處理流程
本頁說明 GET /c/img/*path 從判斷是否需要轉檔、libvips 處理順序到串流回應的完整流程。
分流判斷
GetFromPath 依序判斷,命中即回應並結束:
| 順序 | 條件 | 行為 |
|---|---|---|
| 1 | 路徑以 .pdf 結尾 |
以 application/pdf 串流原檔 |
| 2 | 路徑以 .svg 結尾 |
以 image/svg+xml 串流原檔 |
| 3 | o=1 |
依副檔名推斷 MIME(GetMimeType)並串流原檔 |
| 4 | 本地快取檔存在 | 依 t 設定 Content-Type 並串流快取檔 |
| 5 | 其他 | 進入 libvips 轉檔 |
所有分支都先設定 7 天的 Cache-Control 與 Expires。
轉檔步驟
轉檔在 goroutine 內執行,受 30 秒逾時限制:
| 步驟 | 呼叫 | 說明 |
|---|---|---|
| 1 | os.MkdirAll |
建立快取檔所在目錄 |
| 2 | os.ReadFile → vips.NewImageFromBuffer |
讀原檔並解碼 |
| 3 | GetNewSize → Resize(scale, KernelLanczos3) |
尺寸不同時以 Lanczos3 等比例縮放(規則見 尺寸計算) |
| 4 | GaussianBlur(GetBlur(b)) |
高斯模糊,sigma 限制於 0–100 |
| 5 | Linear([B], [0]) |
亮度:各通道乘以 B;B 非數字時轉檔失敗 |
| 6 | ExportJpeg/ExportPng/ExportAvif/ExportWebp |
依 t 匯出;PNG 不套用品質 |
| 7 | os.WriteFile |
寫入本地快取檔 |
任一步驟失敗都改回 404 佔位 SVG(d=1 或 d=dark 為深色版),並帶 Cache-Control: no-cache。
串流輸出
streamImage(記憶體內 buffer)與 streamFile(原檔)皆以 Transfer-Encoding: chunked 輸出,每累積一個 buffer 就 Flush 一次:
| 檔案大小 | buffer |
|---|---|
| ≤ 50 KiB | 2 KiB |
| ≤ 500 KiB | 4 KiB |
| ≤ 2 MiB | 8 KiB |
| 其他 | 16 KiB |
streamFile 另外送出 Content-Length;ResponseWriter 不支援 http.Flusher 時改用 c.File 一次輸出。