Automatisierung und Entwicklung

Bilder stapelweise mit FFmpeg konvertieren: ein praktischer Leitfaden

5 Minuten Lesezeit
Bilder stapelweise mit FFmpeg konvertieren: ein praktischer Leitfaden

Sie haben 500 PNG-Screenshots, die für Ihre Website in WebP umgewandelt werden müssen. Oder einen Ordner mit TIFF-Exporten aus Lightroom, die zu JPG werden sollen. FFmpeg ist vor allem als Videowerkzeug bekannt, verarbeitet Bilder aber genauso gut — und da es von der Kommandozeile aus läuft, verarbeitet es mit einem einzigen Befehl beliebig viele Dateien.

Warum FFmpeg für Bilder?

FFmpeg ist wahrscheinlich bereits installiert, wenn Sie Videoarbeit machen. Es unterstützt eine breite Palette von Formaten und lässt sich nahtlos in Shell-Skripte und CI-Pipelines integrieren. Für RAW-Kameraformate (CR2, NEF, ARW) besser darktable oder RawTherapee verwenden — FFmpegs RAW-Unterstützung ist begrenzt.

FFmpeg installieren

bash
# macOS
brew install ffmpeg

# Ubuntu / Debian
sudo apt install ffmpeg

# Windows (Chocolatey)
choco install ffmpeg

bash
ffmpeg -version

Das Grundmuster

Jeder Stapelkonvertierungsbefehl folgt dem gleichen Aufbau: eine Shell-Schleife (Linux/macOS) oder eine for-Schleife (Windows). Wichtigste Regel: niemals Quelldateien überschreiben — immer in ein separates Verzeichnis schreiben.

PNG stapelweise in JPG konvertieren

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ät
T['Nahezu verlustfrei', 'Fast ohne Verlust']
y['Drucken, Archivieren', 'Archivieren']
p['Hohe Qualität', 'Gute Qualität']
i['Webfotografie', 'Web']

JPG stapelweise in WebP konvertieren

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 erzeugt Dateien, die typischerweise 25–35 % kleiner sind als gleichwertige JPG. Für Fotos ist Qualität 80–85 der optimale Bereich. Für Logos und Grafiken mit Text besser verlustfreies WebP verwenden.

Stapelweise in PNG konvertieren

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

Gemischte Formate konvertieren

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

Größe ändern und gleichzeitig konvertieren

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

Unterverzeichnisse rekursiv verarbeiten

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

Parallele Verarbeitung für mehr Geschwindigkeit

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

Auf einem 8-Kern-Rechner mit SSD-Speicher reduziert die parallele Verarbeitung die Konvertierungszeit typischerweise um den Faktor 3–5.

Fortschrittsanzeige

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

Fehler abfangen

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

Befehlsreferenz

KonvertierungBefehl (Linux/macOS)Hinweis
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 verlustfreifor f in *.pngdo ffmpeg -i "$f" -lossless 1 output/${f%.png}.webp
Größe ändern + konvertierenfor f in *.jpgdo ffmpeg -i "$f" -vf scale=1080:-1 -q:v 3 output/${f%.jpg}.jpg

Wann FFmpeg nicht das richtige Werkzeug ist

RAW-Kameraformate (CR2, NEF, ARW) — begrenzte Unterstützung. darktable oder RawTherapee verwenden.

AVIF-Kodierung — möglich via -c:v libaom-av1, aber ohne Hardware-Beschleunigung sehr langsam. libavif oder Squoosh CLI sind schneller.

ICC-Farbprofile — FFmpeg bewahrt eingebettete Farbprofile nicht immer. Für farbkritische Arbeit ist ImageMagick zuverlässiger.

Nur wenige Dateien konvertieren? Ein Online-Tool wie FastConvert ist schneller — keine Installation nötig.

Häufig gestellte Fragen

Standardmäßig nicht. Um Metadaten zu erhalten, -map_metadata 0 hinzufügen: ffmpeg -i input.jpg -map_metadata 0 -q:v 3 output.jpg

Das passiert, wenn das Quell-JPG bereits stark komprimiert ist. Immer vom qualitativ hochwertigsten Quellbild ausgehen.

PNG als Ausgabeformat verwenden (verlustfrei) oder -lossless 1 für WebP.

Hängt vom FFmpeg-Build ab. Auf macOS mit Homebrew funktioniert es normalerweise. Unter Linux wird möglicherweise libheif-Unterstützung benötigt.

-y für automatisches Überschreiben oder -n zum Überspringen vorhandener Dateien hinzufügen.

Fazit

FFmpegs Stapelbildkonvertierung läuft auf einer einfachen Shell-Schleife: Quelldateien durchlaufen, Konvertierungsbefehl ausführen, Ergebnis in separates Verzeichnis schreiben. Immer zuerst an einem kleinen Stapel testen, bevor die gesamte Bibliothek verarbeitet wird.

Bilder ohne Kommandozeile konvertieren? FastConvert Bildkonverter — kostenlos, ohne Anmeldung.

Teilen