Automazione e sviluppo

Convertire immagini in blocco con FFmpeg: guida pratica

5 min di lettura
Convertire immagini in blocco con FFmpeg: guida pratica

Hai 500 screenshot PNG da convertire in WebP per il tuo sito. O una cartella di export TIFF da Lightroom da trasformare in JPG. FFmpeg è noto soprattutto come strumento video, ma gestisce le immagini altrettanto bene — e poiché funziona da riga di comando, elabora qualsiasi numero di file con un unico comando.

Perché usare FFmpeg per le immagini?

FFmpeg è probabilmente già installato se lavori con video. Supporta una vasta gamma di formati e si integra naturalmente in script shell e pipeline CI. Per i formati RAW (CR2, NEF, ARW), usa darktable o RawTherapee — il supporto RAW di FFmpeg è limitato.

Installare FFmpeg

bash
# macOS
brew install ffmpeg

# Ubuntu / Debian
sudo apt install ffmpeg

# Windows (Chocolatey)
choco install ffmpeg

bash
ffmpeg -version

La struttura di base

Ogni comando di conversione in blocco segue la stessa struttura: un ciclo shell (Linux/macOS) o un ciclo for (Windows). Regola fondamentale: non sovrascrivere mai i file sorgente — scrivere sempre in una directory di output separata.

Convertire tutti i PNG in 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àUtilizzo tipico
1–2Quasi senza perditaStampa, archivio
3–5Alta qualitàFotografia web
6–10Qualità mediaAnteprime
11+Bassa qualitàDa evitare

Convertire tutti i JPG in 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 produce file tipicamente il 25–35 % più piccoli di un JPG equivalente. Per le foto, 80–85 è l'intervallo ottimale. Per loghi e grafiche con testo, usa WebP lossless.

Convertire in PNG

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

Convertire formati misti

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

Ridimensionare e convertire in un solo passaggio

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

Elaborazione ricorsiva delle sottocartelle

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

Elaborazione parallela per maggiore velocità

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

Su un computer con 8 core e SSD, l'elaborazione parallela riduce tipicamente il tempo di conversione di 3–5 volte.

Indicatore di avanzamento

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

Gestione degli errori

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

Riferimento comandi

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

Quando FFmpeg non è lo strumento giusto

Formati RAW (CR2, NEF, ARW) — supporto limitato. Usa darktable o RawTherapee.

Codifica AVIF — possibile via -c:v libaom-av1 ma molto lenta senza accelerazione hardware. libavif o Squoosh CLI sono più veloci.

Profili colore ICC — FFmpeg non li preserva sempre. Per lavoro critico sul colore, ImageMagick è più affidabile.

Solo pochi file da convertire? Uno strumento online come FastConvert è più veloce — senza installazione.

Domande frequenti

Per impostazione predefinita no. Per preservarli, aggiungere -map_metadata 0: ffmpeg -i input.jpg -map_metadata 0 -q:v 3 output.jpg

Accade quando il JPG sorgente è già molto compresso. Convertire sempre dalla sorgente di qualità più alta disponibile.

Usare PNG come formato di output (lossless) o -lossless 1 per WebP.

Dipende dalla compilazione di FFmpeg. Su macOS con Homebrew, di solito funziona.

Aggiungere -y per sovrascrivere automaticamente o -n per saltare i file esistenti.

Conclusione

La conversione in blocco con FFmpeg si riduce a un semplice ciclo shell. Testa sempre su un piccolo lotto prima di elaborare l'intera libreria.

Convertire immagini senza riga di comando? FastConvert — gratuito, senza registrazione.

Condividi