自動化と開発

FFmpegで画像を一括変換する方法:実践ガイド

5 分で読めます
FFmpegで画像を一括変換する方法:実践ガイド

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 ffmpeg

bash
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"
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"' _ {}

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 → 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による一括画像変換はシンプルなシェルループで完結する。ライブラリ全体を処理する前に、必ず小さなバッチでテストすること。

コマンドラインなしで画像を変換するには?FastConvert — 無料、登録不要。

共有