自动化与开发

如何用 FFmpeg 批量转换图片:实践指南

5 分钟阅读

你有 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 是最佳范围。对于带文字的 logo 和图形,使用无损 WebP。

批量转换为 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 格式(CR2、NEF、ARW)——支持有限。使用 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 图片转换器——免费,无需注册。

分享