上週有人發來一個資料夾:312 張商品圖,尺寸從 800×800 到 5472×3648 不等,格式有 JPG、PNG 還有幾張 HEIC。平台要求 1600×1600 的 JPG,不超過 2MB。另一個常見版本是部落格搬家:兩百多張 PNG 配圖,要統一轉成 WebP 並把寬度限制在 1600 以內。這兩件事看起來不同,做法其實是同一條流水線。

為什麼分開跑會傷畫質

最直覺的做法是:先用縮放工具把尺寸改好、下載;再用轉換工具改格式、下載;最後用壓縮工具壓體積。三步都能批次,但每一步結束時檔案都要重新編碼一次。JPG 是有損格式,每編碼一次就丟一點資訊,三次下來放大看邊緣已經有明顯的色塊和毛邊。

正確的做法是隻在最後編碼一次:圖片解碼成點陣圖後,縮放、裁切、轉格式都在記憶體裡進行,直到最後一步才按目標格式和品質寫出檔案。批次圖片處理就是按這個思路設計的——六個步驟固定順序,中間沒有任何有損環節。

分三次工具處理與一次流水線處理的畫質對比示意
同一張圖:三次重編碼(左)與一次編碼(右)的邊緣差異

場景一:三百張商品圖上架

目標:1600×1600、JPG、不超過 2MB、右下角帶店名。按步驟設:

  1. 尺寸:選「填滿 1600×1600」。寬幅圖和直式圖會先縮到剛好覆蓋這個框。
  2. 裁切比例:1:1。超出正方形的部分從中間裁掉,主體置中的商品圖不受影響。
  3. 浮水印:開啟,文字填店名,位置右下,大小 4%,不透明度 50%。
  4. 輸出:JPG,品質 85%,檔名選「重新命名為 名字-001」,字首填 SKU 或品類名。

312 張圖在一台普通筆記型電腦上大約三到四分鐘跑完,結果都在 200KB 到 600KB 之間,遠低於 2MB 的上限。幾張 HEIC 原圖直接被讀進來,不用先轉一遍。打包下載的 ZIP 裡檔名整整齊齊,上傳到後台不用再改名。

如果有些商品圖主體明顯偏在一側,置中裁切會切掉它們。這種圖挑出來,用圖片裁剪手動框一下,再單獨跑一遍流水線。一批裡這種圖通常不到一成。

場景二:部落格相簿整體換成 WebP

目標:所有配圖轉 WebP,寬度不超過 1600,截圖類保持清晰。設定比上一個場景更簡單:

  1. 尺寸:選「寬度 1600」,關掉「允許放大」。本來就不到 1600 寬的圖不會被動。
  2. 輸出:WebP,品質 80%。
  3. 檔名:保留原名。這樣文章裡的引用只需要把副檔名從 .png 改成 .webp。

兩百張 PNG 轉完一般能省 70% 以上的體積。要注意的只有一種圖:帶透明背景的 Logo 和圖示。WebP 支援透明,流水線會保留透明通道,不用擔心;但如果你的目標是 JPG,透明區域會被填成白色,這類圖應該留在 PNG。

轉換完之後用圖片格式轉換隨手檢查兩張在舊瀏覽器裡的相容性,心裡更有底。

「填滿」「裝進」「最長邊」怎麼選

縮放方式是最容易選錯的一項,三種常用模式各管一種場景:

  • 最長邊:只關心圖不要太大,不在乎比例。網頁配圖、相簿分享用它。
  • 裝進 寬×高:整張圖必須完整放進一個框裡,不裁切,可能有一邊留空。縮圖、投影片用它。
  • 填滿 寬×高:框必須被鋪滿,多出的部分裁掉。電商主圖、頭像、固定比例的卡片圖用它,通常和「裁切比例」配合。

一個簡單的判斷:平台給的是「不超過多少像素」,用最長邊或裝進;平台給的是「必須是多少×多少」,用填滿。

跑之前的兩個檢查

第一,看即時預覽。流水線會把第一張圖按當前所有設定即時渲染出來,浮水印位置、裁切是否切到主體、顏色有沒有變,在這裡一眼能看出來。確認了再點「全部處理」,不要處理完三百張才發現店名打在了商品上。

第二,留一份原圖。流水線不會改動你的原檔案,但重新編碼後 EXIF 和拍攝資訊就沒了,打包下載前確認原圖還在別處存著。需要清掉定位資訊的照片這反而是好事,詳見EXIF 中介資料是什麼、為什麼要刪。

批次改尺寸和格式的核心就一句話:設定一次,整批跑完,中間不要寫入磁碟。其餘的變化,都只是三個縮放模式和兩個輸出格式之間的選擇。