WebP用に変換が必要なPNGスクリーンショットが500枚ある。FFmpegは主に動画ツールとして知られているが、画像も同様に扱える。コマンドラインで動作するため、1つのコマンドで任意の数のファイルを処理できる。
FFmpegを画像に使う理由
動画作業をしているなら、FFmpegはすでにインストールされている可能性が高い。RAWカメラフォーマット(CR2、NEF、ARW)にはdarktableかRawTherapeeを使用すること。
FFmpegのインストール
bash
# macOS
brew install ffmpeg
# Ubuntu / Debian
sudo apt install ffmpeg
# Windows (Chocolatey)
choco install ffmpegbash
ffmpeg -version基本パターン
すべての一括変換コマンドは同じ構造に従う:シェルループ(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"' _ {}SSDストレージを持つ8コアマシンでは、並列処理により変換時間が通常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の方が速い — インストール不要。
よくある質問
まとめ
FFmpegによる一括画像変換はシンプルなシェルループで完結する。ライブラリ全体を処理する前に、必ず小さなバッチでテストすること。
コマンドラインなしで画像を変換するには?FastConvert — 無料、登録不要。
