你有 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 是最佳范围。对于带文字的 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"
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 格式(CR2、NEF、ARW)——支持有限。使用 darktable 或 RawTherapee。
AVIF 编码——没有硬件加速时极慢。
只需转换几个文件?FastConvert 更快——无需安装。