Automatyzacja i rozwój

Jak masowo konwertować obrazy za pomocą FFmpeg: praktyczny poradnik

5 min czytania
Jak masowo konwertować obrazy za pomocą FFmpeg: praktyczny poradnik

Masz 500 zrzutów ekranu PNG do konwersji na WebP dla swojej strony. Albo folder eksportów TIFF z Lightrooma, które muszą stać się JPG. FFmpeg jest znany głównie jako narzędzie wideo, ale równie dobrze radzi sobie z obrazami — a ponieważ działa z linii poleceń, jednym poleceniem przetwarza dowolną liczbę plików.

Dlaczego FFmpeg do obrazów?

FFmpeg jest prawdopodobnie już zainstalowany, jeśli pracujesz z wideo. Obsługuje szeroką gamę formatów i naturalnie integruje się ze skryptami shell i pipeline'ami CI. Dla formatów RAW (CR2, NEF, ARW) lepiej użyć darktable lub RawTherapee — wsparcie RAW w FFmpeg jest ograniczone.

Instalacja FFmpeg

bash
# macOS
brew install ffmpeg

# Ubuntu / Debian
sudo apt install ffmpeg

# Windows (Chocolatey)
choco install ffmpeg

bash
ffmpeg -version

Podstawowa struktura polecenia

Każde polecenie masowej konwersji ma tę samą strukturę: pętla shell (Linux/macOS) lub pętla for (Windows). Kluczowa zasada: nigdy nie nadpisuj plików źródłowych — zawsze pisz wyniki do oddzielnego katalogu.

Masowa konwersja PNG do 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:vJakośćTypowe zastosowanie
1–2Niemal bezstratnaDruk, archiwizacja
3–5Wysoka jakośćFotografia web
6–10Średnia jakośćPodglądy, miniatury
11+Niska jakośćUnikać

Masowa konwersja JPG do 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 daje pliki typowo o 25–35 % mniejsze niż równoważny JPG. Dla fotografii, zakres 80–85 to optimum. Dla logotypów i grafik z tekstem użyj bezstratnego WebP.

Konwersja do PNG

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

Konwersja mieszanych formatów

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

Zmiana rozmiaru i konwersja w jednym przejściu

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

Rekurencyjne przetwarzanie podkatalogów

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

Przetwarzanie równoległe dla przyspieszenia

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

Na maszynie z 8 rdzeniami i dyskiem SSD przetwarzanie równoległe typowo skraca czas konwersji 3–5-krotnie.

Wskaźnik postępu

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

Obsługa błędów

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

Spis poleceń

KonwersjaPolecenie (Linux/macOS)Uwagi
Wszystkie PNG → JPGfor f in *.pngdo ffmpeg -i "$f" -q:v 3 output/${f%.png}.jpg
Wszystkie JPG → WebPfor f in *.jpgdo ffmpeg -i "$f" -quality 85 output/${f%.jpg}.webp
Wszystkie JPG → PNGfor f in *.jpgdo ffmpeg -i "$f" output/${f%.jpg}.png
Wszystkie → WebP bezstratniefor f in *.pngdo ffmpeg -i "$f" -lossless 1 output/${f%.png}.webp
Zmiana rozmiaru + konwersjafor f in *.jpgdo ffmpeg -i "$f" -vf scale=1080:-1 -q:v 3 output/${f%.jpg}.jpg

Kiedy FFmpeg nie jest właściwym narzędziem

Formaty RAW (CR2, NEF, ARW) — ograniczone wsparcie. Użyj darktable lub RawTherapee.

Kodowanie AVIF — możliwe przez -c:v libaom-av1, ale bardzo wolne bez akceleracji sprzętowej. libavif lub Squoosh CLI są szybsze.

Profile kolorów ICC — FFmpeg nie zawsze je zachowuje. Dla pracy krytycznej kolorystycznie ImageMagick jest bardziej niezawodny.

Tylko kilka plików? Narzędzie online jak FastConvert jest szybsze — bez instalacji.

Najczęściej zadawane pytania

Domyślnie nie. Aby zachować metadane, dodaj -map_metadata 0: ffmpeg -i input.jpg -map_metadata 0 -q:v 3 output.jpg

Dzieje się tak, gdy źródłowy JPG jest już mocno skompresowany. Zawsze konwertuj z najwyższej jakości dostępnego źródła.

Użyj PNG jako formatu wyjściowego (bezstratny) lub -lossless 1 dla WebP.

Zależy od kompilacji FFmpeg. Na macOS z Homebrew zazwyczaj działa.

Dodaj -y dla automatycznego nadpisywania lub -n dla pomijania istniejących plików.

Podsumowanie

Masowa konwersja obrazów przez FFmpeg sprowadza się do prostej pętli shell. Zawsze testuj na małej partii przed przetworzeniem całej biblioteki.

Konwertować obrazy bez wiersza poleceń? FastConvert — bezpłatnie, bez rejestracji.

Udostępnij