你有 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 ffmpegbash
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"
donebash
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"
donebash
mkdir -p output
for f in *.png; do
ffmpeg -i "$f" -lossless 1 "output/${f%.png}.webp"
doneWebP 通常比同等品質的 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"
donebash
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 → JPG | for f in *.png | do ffmpeg -i "$f" -q:v 3 output/${f%.png}.jpg |
| 所有 JPG → WebP | for f in *.jpg | do ffmpeg -i "$f" -quality 85 output/${f%.jpg}.webp |
| 所有 JPG → PNG | for f in *.jpg | do ffmpeg -i "$f" output/${f%.jpg}.png |
| 所有 → WebP 無損 | for f in *.png | do ffmpeg -i "$f" -lossless 1 output/${f%.png}.webp |
| 調整大小+轉換 | for f in *.jpg | do ffmpeg -i "$f" -vf scale=1080:-1 -q:v 3 output/${f%.jpg}.jpg |
FFmpeg 不適合的場景
相機 RAW 格式——支援有限。使用 darktable 或 RawTherapee。
AVIF 編碼——沒有硬體加速時極慢。
只需轉換幾個檔案?FastConvert 更快——無需安裝。
