Patu

AVIF vs WebP vs JPEG: numeri reali a parità di qualità

La maggior parte delle affermazioni del tipo “AVIF è il 50% più piccolo di JPEG” mette a confronto un JPEG a qualità 75 con un AVIF con un’impostazione diversa. Non è un confronto: un -q 75 in un encoder non è la stessa immagine di un -q 75 in un altro. L’unica domanda onesta è: a qualità percepita fissa, quanti byte servono a ciascun formato?

Lo abbiamo misurato. Non su una manciata di immagini di punta, ma su oltre 1.900 fotografie reali, con gli encoder reali, valutate con una metrica percettiva invece che con un numero di qualità indovinato.

Come lo abbiamo misurato

Quell’ultimo punto conta: confrontare cwebp -q 80 con avifenc -q 80 non ha senso. Confrontare “il WebP che sembra bello quanto l’AVIF” è tutto il gioco.

I numeri

A ssimulacra2 85 (alta qualità, difficile da distinguere dall’originale) — le 548 foto in cui tutti e quattro i formati lo raggiungono:

Formato Mediana per foto vs JPEG
JPEG (libjpeg-turbo) 833 KB —
WebP 708 KB −16%
AVIF 605 KB −28%
JPEG XL 553 KB −33%

A parità di qualità, AVIF è il 16% più piccolo di WebP, ed entrambi battono JPEG con largo margine.

A ssimulacra2 80 (buona qualità, un target web comune) — su 1.884 foto:

Formato Mediana per foto vs JPEG
JPEG 510 KB —
WebP 471 KB −11%
AVIF 368 KB −29%
JPEG XL 351 KB −32%

Il vantaggio di AVIF si allarga a 80 (−29% vs JPEG, −21% vs WebP): mantiene il dettaglio a bitrate più bassi, dove JPEG e WebP iniziano a sfaldarsi.

Questi dati sono coerenti con la letteratura indipendente: un AVIF che si colloca circa il 25-30% sotto JPEG a parità di qualità è un risultato ampiamente replicato. Quello che aggiunge questa misurazione è che è calcolata in modo percettivo, a parità di qualità, su un set di foto ampio e non selezionato ad arte.

Le avvertenze, dette senza giri di parole

Cosa significa questo in pratica

Servi AVIF con fallback a WebP e JPEG, e punta a un punteggio percettivo, non a un numero di qualità. Un -q fisso distribuisce una qualità incoerente tra le immagini: alcune sovracompresse e visibilmente rovinate, altre inutilmente pesanti. Cercare la qualità dell’encoder immagine per immagine per raggiungere un punteggio ssimulacra2 target è ciò che dà sia i byte più piccoli sia una qualità che puoi davvero promettere.

È esattamente ciò che fa Patu: cerca la qualità dell’encoder per ogni immagine per raggiungere un target percettivo, e restituisce AVIF e WebP con fallback JPEG, dietro una CDN. I numeri sopra sono il motivo per cui il default è AVIF-first.

curl -X POST "https://patu.dev/v1/compress?formats=avif,webp,fallback&target=85" \
  -H "X-Api-Key: $PATU_KEY" \
  --data-binary @photo.jpg -o photo.avif

Dai una qualità target; ottieni il file più piccolo a quella qualità, nei formati che un browser può davvero usare.


Metodo e dati: l’harness di benchmark di Patu sulla categoria foto; ssimulacra2 tramite l’implementazione rust-av; encoder libjpeg-turbo, libwebp, libaom, libjxl nelle loro versioni rilasciate. Le dimensioni sono la mediana tra le foto in cui ogni formato raggiunge il punteggio target.