Automatisation et développement

Convertir des images en masse avec FFmpeg : guide pratique

5 min de lecture
Convertir des images en masse avec FFmpeg : guide pratique

Vous avez 500 captures d'écran PNG à convertir en WebP pour votre site. Ou un dossier d'exports TIFF de Lightroom à passer en JPG. FFmpeg est surtout connu comme outil vidéo, mais il gère les images tout aussi bien — et depuis la ligne de commande, une seule commande traite autant de fichiers que vous voulez.

Pourquoi utiliser FFmpeg pour les images ?

FFmpeg est probablement déjà installé si vous faites du travail vidéo. Il prend en charge de nombreux formats et s'intègre naturellement dans les scripts shell et les pipelines CI. Pour les formats RAW (CR2, NEF, ARW), utilisez darktable ou RawTherapee — la prise en charge RAW de FFmpeg est limitée.

Installer FFmpeg

bash
# macOS
brew install ffmpeg

# Ubuntu / Debian
sudo apt install ffmpeg

# Windows (Chocolatey)
choco install ffmpeg

bash
ffmpeg -version

La structure de base

Chaque commande de conversion en masse suit le même schéma : une boucle shell (Linux/macOS) ou une boucle for (Windows). Règle essentielle : ne jamais écraser les fichiers source — toujours écrire dans un répertoire de sortie séparé.

Convertir tous les PNG en 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:vQualitéUtilisation typique
1–2Presque sans perteImpression, archivage
3–5Haute qualitéPhotographie web
6–10Qualité moyenneAperçus, miniatures
11+Basse qualitéÀ éviter

Convertir tous les JPG en 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 produit des fichiers 25–35 % plus petits qu'un JPG équivalent. Pour les photos, une qualité de 80–85 est la plage optimale. Pour les logos et les graphiques avec du texte, utilisez WebP sans perte.

Convertir en PNG

bash
mkdir -p output
for f in *.jpg *.jpeg; do
  [ -f "$f" ] || continue
  ffmpeg -i "$f" "output/${f%.*}.png"
done

Convertir des formats mixtes

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

Redimensionner et convertir en une seule passe

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

Traitement récursif des sous-répertoires

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

Traitement parallèle pour accélérer

bash
mkdir -p output
ls *.png | xargs -P 4 -I {} sh -c 'ffmpeg -i "$1" -q:v 3 "output/${1%.png}.jpg"' _ {}

Sur une machine 8 cœurs avec SSD, le traitement parallèle réduit typiquement le temps de conversion d'un facteur 3 à 5.

Indicateur de progression

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

Gestion des erreurs

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

Référence des commandes

ConversionCommande (Linux/macOS)Note
Tous PNG → JPGfor f in *.pngdo ffmpeg -i "$f" -q:v 3 output/${f%.png}.jpg
Tous JPG → WebPfor f in *.jpgdo ffmpeg -i "$f" -quality 85 output/${f%.jpg}.webp
Tous JPG → PNGfor f in *.jpgdo ffmpeg -i "$f" output/${f%.jpg}.png
Tous → WebP sans pertefor f in *.pngdo ffmpeg -i "$f" -lossless 1 output/${f%.png}.webp
Redimensionner + convertirfor f in *.jpgdo ffmpeg -i "$f" -vf scale=1080:-1 -q:v 3 output/${f%.jpg}.jpg

Quand FFmpeg n'est pas le bon outil

Formats RAW (CR2, NEF, ARW) — support limité. Utilisez darktable ou RawTherapee.

Encodage AVIF — possible via -c:v libaom-av1 mais très lent sans accélération matérielle. libavif ou Squoosh CLI est plus rapide.

Profils colorimétriques ICC — FFmpeg ne les préserve pas toujours. Pour un travail critique en couleur, ImageMagick est plus fiable.

Juste quelques fichiers à convertir ? Un outil en ligne comme FastConvert est plus rapide — sans installation.

Questions fréquentes

Par défaut non. Pour préserver les métadonnées, ajouter -map_metadata 0 : ffmpeg -i input.jpg -map_metadata 0 -q:v 3 output.jpg

Cela arrive quand le JPG source est déjà très compressé. Toujours convertir depuis la source de plus haute qualité disponible.

Utiliser PNG comme format de sortie (sans perte) ou -lossless 1 pour WebP.

Cela dépend de la compilation de FFmpeg. Sur macOS avec Homebrew, cela fonctionne généralement. Sur Linux, il peut falloir libheif.

Ajouter -y pour écraser automatiquement ou -n pour ignorer les fichiers existants.

En résumé

La conversion en masse avec FFmpeg se résume à une boucle shell simple. Testez toujours sur un petit lot avant de traiter l'ensemble de votre bibliothèque, et utilisez -loglevel quiet avec un journal d'erreurs pour identifier les fichiers problématiques.

Convertir des images sans ligne de commande ? FastConvert — gratuit, sans inscription.

Partager