Automatisering och utveckling

Masskonvertera bilder med FFmpeg: en praktisk guide

5 min lästid
Masskonvertera bilder med FFmpeg: en praktisk guide

Du har 500 PNG-skärmdumpar som behöver konverteras till WebP för din webbplats. FFmpeg är bäst känt som ett videoverktyg, men hanterar bilder lika bra — och eftersom det körs från kommandoraden, behandlar det valfritt antal filer med ett enda kommando.

Varför FFmpeg för bilder?

FFmpeg är troligtvis redan installerat om du arbetar med video. Det stöder ett brett utbud av format och integreras naturligt i shellskript och CI-pipelines. För RAW-kameraformat (CR2, NEF, ARW), använd darktable eller RawTherapee — FFmpegs RAW-stöd är begränsat.

Installera FFmpeg

bash
# macOS
brew install ffmpeg

# Ubuntu / Debian
sudo apt install ffmpeg

# Windows (Chocolatey)
choco install ffmpeg

bash
ffmpeg -version

Det grundläggande mönstret

Varje bulk-konverteringskommando följer samma struktur: en shell-loop (Linux/macOS) eller en for-loop (Windows). Grundregel: skriv aldrig över källfiler — skriv alltid till en separat utdatakatalog.

Masskonvertera PNG till 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:vKvalitetTypisk användning
1-2Nästan förlustfriUtskrift, arkivering
3-5Hög kvalitetWebbfotografi
6-10MedelFörhandsvisningar
11+Låg kvalitetUndvik

Masskonvertera JPG till 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 ger typiskt 25–35 % mindre filer än motsvarande JPG. För foton är 80–85 det optimala intervallet. För logotyper och grafik med text, använd lossless WebP.

Konvertera till PNG

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

Konvertera blandade format

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

Ändra storlek och konvertera i ett steg

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

Rekursiv behandling av undermappar

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

Parallell bearbetning för snabbhet

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

På en 8-kärnig maskin med SSD-lagring minskar parallell bearbetning typiskt konverteringstiden med 3–5 gånger.

Förloppsindikator

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

Felhantering

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

Kommandoreferens

KonverteringKommando (Linux/macOS)Kommentar
Alla PNG → JPGfor f in *.pngdo ffmpeg -i "$f" -q:v 3 output/${f%.png}.jpg
Alla JPG → WebPfor f in *.jpgdo ffmpeg -i "$f" -quality 85 output/${f%.jpg}.webp
Alla JPG → PNGfor f in *.jpgdo ffmpeg -i "$f" output/${f%.jpg}.png
Alla → WebP förlustfrifor f in *.pngdo ffmpeg -i "$f" -lossless 1 output/${f%.png}.webp
Ändra storlek + konverterafor f in *.jpgdo ffmpeg -i "$f" -vf scale=1080:-1 -q:v 3 output/${f%.jpg}.jpg

När FFmpeg inte är rätt verktyg

RAW-kameraformat (CR2, NEF, ARW) — begränsat stöd. Använd darktable eller RawTherapee.

AVIF-kodning — möjlig via -c:v libaom-av1 men mycket långsam utan hårdvaruacceleration.

Bara några filer? FastConvert är snabbare — utan installation.

Vanliga frågor

Som standard nej. Lägg till -map_metadata 0: ffmpeg -i input.jpg -map_metadata 0 -q:v 3 output.jpg

Det händer när käll-JPG redan är kraftigt komprimerat. Konvertera alltid från bästa tillgängliga källa.

Använd PNG som utdataformat eller -lossless 1 för WebP.

Lägg till -y för automatisk överskrivning eller -n för att hoppa över befintliga filer.

Sammanfattning

FFmpeg-bulk-bildkonvertering handlar om en enkel shell-loop. Testa alltid på en liten batch innan du bearbetar hela ditt bibliotek.

Konvertera bilder utan kommandoraden? FastConvert — gratis, ingen registrering.

Dela