自動化與開發

如何用 FFmpeg 批次轉換圖片:實踐指南

5 分鐘閱讀
如何用 FFmpeg 批次轉換圖片:實踐指南

你有 500 張 PNG 截圖需要轉換成 WebP 用於網站。FFmpeg 主要以影片工具著稱,但處理圖片同樣出色——而且因為從命令列執行,一條指令就能處理任意數量的檔案。

為何用 FFmpeg 處理圖片?

如果你做影片工作,FFmpeg 可能已經安裝了。對於 RAW 相機格式(CR2、NEF、ARW),使用 darktable 或 RawTherapee——FFmpeg 的 RAW 支援有限。

安裝 FFmpeg

bash
# macOS
brew install ffmpeg

# Ubuntu / Debian
sudo apt install ffmpeg

# Windows (Chocolatey)
choco install ffmpeg

bash
ffmpeg -version

核心指令模式

每個批次轉換指令遵循相同的結構:shell 迴圈(Linux/macOS)或 for 迴圈(Windows)。關鍵原則:永不覆蓋來源檔案——始終將輸出寫入獨立的目錄。

批次將 PNG 轉換為 JPG

bash
mkdir -p output
for f in *.png; do
  ffmpeg -i "$f" -q:v 2 "output/${f%.png}.jpg"
done

bash
mkdir output
for %f in (*.png) do ffmpeg -i "%f" -q:v 2 "output/%~nf.jpg"

bash
New-Item -ItemType Directory -Force output
Get-ChildItem *.png | ForEach-Object {
  ffmpeg -i $_.FullName -q:v 2 "output/$($_.BaseName).jpg"
}

-q:v品質典型用途
1-2近似無損印刷、存檔
3-5高品質網路攝影
6-10中等品質預覽、縮圖
11+低品質避免使用

批次將 JPG 轉換為 WebP

bash
mkdir -p output
for f in *.jpg *.jpeg; do
  [ -f "$f" ] || continue
  ffmpeg -i "$f" -quality 85 "output/${f%.*}.webp"
done

bash
mkdir -p output
for f in *.png; do
  ffmpeg -i "$f" -lossless 1 "output/${f%.png}.webp"
done

WebP 通常比同等品質的 JPG 小 25–35%。對於照片,80–85 是最佳範圍。

批次轉換為 PNG

bash
mkdir -p output
for f in *.jpg *.jpeg; do
  [ -f "$f" ] || continue
  ffmpeg -i "$f" "output/${f%.*}.png"
done

轉換混合格式

bash
mkdir -p output
for f in *.jpg *.jpeg *.png *.webp *.tiff *.bmp; do
  [ -f "$f" ] || continue
  ffmpeg -i "$f" -q:v 3 "output/${f%.*}.jpg"
done

同時調整大小和轉換

bash
mkdir -p output
for f in *.png; do
  ffmpeg -i "$f" -vf scale=1080:-1 -q:v 3 "output/${f%.png}.jpg"
done

bash
mkdir -p output
for f in *.jpg; do
  ffmpeg -i "$f" -vf "crop='min(iw,ih)':'min(iw,ih)',scale=200:200" \
    "output/${f%.jpg}_thumb.jpg"
done

遞迴處理子目錄

bash
find . -name "*.png" -not -path "./output*" | while read f; do
  output="output/${f#./}"
  mkdir -p "$(dirname "$output")"
  ffmpeg -i "$f" -q:v 3 "${output%.png}.jpg"
done

並行處理提速

bash
mkdir -p output
ls *.png | xargs -P 4 -I {} sh -c 'ffmpeg -i "$1" -q:v 3 "output/${1%.png}.jpg"' _ {}

在 8 核配 SSD 的機器上,並行處理通常可將轉換時間縮短 3–5 倍。

進度顯示

bash
total=$(ls *.png | wc -l)
count=0
mkdir -p output
for f in *.png; do
  count=$((count + 1))
  echo "[$count/$total] $f"
  ffmpeg -loglevel quiet -i "$f" -q:v 3 "output/${f%.png}.jpg"
done

錯誤處理

bash
mkdir -p output
error_log="errors.txt"
> "$error_log"
for f in *.jpg *.jpeg *.png *.webp; do
  [ -f "$f" ] || continue
  if ffmpeg -loglevel error -i "$f" -quality 85 "output/${f%.*}.webp" 2>>"$error_log"; then
    echo "✓ $f"
  else
    echo "✗ $f"
  fi
done

指令參考

轉換指令(Linux/macOS)說明
所有 PNG → JPGfor f in *.pngdo ffmpeg -i "$f" -q:v 3 output/${f%.png}.jpg
所有 JPG → WebPfor f in *.jpgdo ffmpeg -i "$f" -quality 85 output/${f%.jpg}.webp
所有 JPG → PNGfor f in *.jpgdo ffmpeg -i "$f" output/${f%.jpg}.png
所有 → WebP 無損for f in *.pngdo ffmpeg -i "$f" -lossless 1 output/${f%.png}.webp
調整大小+轉換for f in *.jpgdo ffmpeg -i "$f" -vf scale=1080:-1 -q:v 3 output/${f%.jpg}.jpg

FFmpeg 不適合的場景

相機 RAW 格式——支援有限。使用 darktable 或 RawTherapee。

AVIF 編碼——沒有硬體加速時極慢。

只需轉換幾個檔案?FastConvert 更快——無需安裝。

常見問題

預設不會。新增 -map_metadata 0: ffmpeg -i input.jpg -map_metadata 0 -q:v 3 output.jpg

當來源 JPG 已經高度壓縮時會發生。始終從最高品質的來源檔案轉換。

使用 PNG 作為輸出格式,或對 WebP 使用 -lossless 1。

新增 -y 自動覆蓋,或 -n 跳過已有檔案。

總結

FFmpeg 批次圖片轉換就是一個簡單的 shell 迴圈。在處理整個圖庫之前,始終先用小批次測試。

需要無命令列轉換圖片?FastConvert——免費,無需註冊。

分享