# 影像處理流程

本頁說明 `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 等比例縮放（規則見 [尺寸計算](/zh/api-reference-sizing)） |
| 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` 一次輸出。
