Automatisering en ontwikkeling

Afbeeldingen in bulk converteren met FFmpeg: een praktische gids

5 min leestijd
Afbeeldingen in bulk converteren met FFmpeg: een praktische gids

Je hebt 500 PNG-schermafbeeldingen die voor je website naar WebP moeten worden geconverteerd. Of een map met TIFF-exports uit Lightroom die JPG moeten worden. FFmpeg is vooral bekend als videotool, maar verwerkt afbeeldingen net zo goed — en omdat het via de opdrachtregel werkt, verwerkt het elke gewenste hoeveelheid bestanden met één opdracht.

Waarom FFmpeg voor afbeeldingen?

FFmpeg is waarschijnlijk al geïnstalleerd als je videowerk doet. Het ondersteunt een breed scala aan formaten en integreert van nature in shellscripts en CI-pipelines. Voor RAW-cameraformaten (CR2, NEF, ARW) gebruik je darktable of RawTherapee — FFmpegs RAW-ondersteuning is beperkt.

FFmpeg installeren

bash
# macOS
brew install ffmpeg

# Ubuntu / Debian
sudo apt install ffmpeg

# Windows (Chocolatey)
choco install ffmpeg

bash
ffmpeg -version

Het basispatroon

Elke opdracht voor bulkconversie volgt hetzelfde patroon: een shell-lus (Linux/macOS) of een for-lus (Windows). Basisregel: nooit bronbestanden overschrijven — altijd naar een aparte uitvoermap schrijven.

Alle PNG naar JPG converteren

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:vKwaliteitTypisch gebruik
1–2Bijna verliesvrijDrukken, archiveren
3–5Hoge kwaliteitWebfotografie
6–10Gemiddelde kwaliteitVoorbeelden, miniaturen
11+Lage kwaliteitVermijden

Alle JPG naar WebP converteren

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 levert bestanden op die doorgaans 25–35 % kleiner zijn dan equivalente JPG. Voor foto's is kwaliteit 80–85 het optimale bereik. Voor logo's en afbeeldingen met tekst gebruik je lossless WebP.

Naar PNG converteren

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

Gemengde formaten converteren

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

Formaat wijzigen en tegelijk converteren

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

Recursief verwerken van submappen

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

Parallelle verwerking voor meer snelheid

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

Op een machine met 8 cores en SSD-opslag verkort parallelle verwerking de conversietijd doorgaans met een factor 3 tot 5.

Voortgangsindicator

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

Foutafhandeling

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

Opdrachtenoverzicht

ConversieOpdracht (Linux/macOS)Opmerking
Alle PNG → JPGfor f in *.pngdo ffmpeg -i "$f" -q:v 3 output/${f%.png}.jpg
Alle JPG → WebPfor f in *.jpgdo ffmpeg -i "$f" -quality 85 output/${f%.jpg}.webp
Alle JPG → PNGfor f in *.jpgdo ffmpeg -i "$f" output/${f%.jpg}.png
Alle → WebP verliesvrijfor f in *.pngdo ffmpeg -i "$f" -lossless 1 output/${f%.png}.webp
Formaat wijzigen + converterenfor f in *.jpgdo ffmpeg -i "$f" -vf scale=1080:-1 -q:v 3 output/${f%.jpg}.jpg

Wanneer FFmpeg niet het juiste gereedschap is

RAW-cameraformaten (CR2, NEF, ARW) — beperkte ondersteuning. Gebruik darktable of RawTherapee.

AVIF-codering — mogelijk via -c:v libaom-av1 maar zonder hardwareversnelling erg traag. libavif of Squoosh CLI zijn sneller.

ICC-kleurprofielen — FFmpeg bewaart ze niet altijd. Voor kleurkritisch werk is ImageMagick betrouwbaarder.

Slechts enkele bestanden? Een online tool zoals FastConvert is sneller — zonder installatie.

Veelgestelde vragen

Standaard niet. Om metadata te behouden, voeg -map_metadata 0 toe: ffmpeg -i input.jpg -map_metadata 0 -q:v 3 output.jpg

Dit gebeurt wanneer de bron-JPG al sterk gecomprimeerd is. Converteer altijd vanuit de hoogst beschikbare kwaliteitsbron.

Gebruik PNG als uitvoerformaat (verliesvrij) of -lossless 1 voor WebP.

Hangt af van de FFmpeg-build. Op macOS met Homebrew werkt het doorgaans.

Voeg -y toe voor automatisch overschrijven of -n om bestaande bestanden over te slaan.

Samenvatting

FFmpeg-bulkconversie draait om een eenvoudige shell-lus. Test altijd op een kleine batch voordat je je volledige bibliotheek verwerkt.

Afbeeldingen converteren zonder opdrachtregel? FastConvert — gratis, zonder aanmelding.

Delen