Il JPEG è probabilmente il formato di immagine più usato al mondo, ed è anche uno dei più eleganti dal punto di vista tecnico. Capire cosa succede dentro l'encoder permette di scegliere la qualità con criterio, riconoscere gli artefatti e sapere quali operazioni danneggiano una foto e quali no. Seguiamo un'immagine passo dopo passo.
1. Da RGB a YCbCr
Il primo passo separa la luminosità dal colore. I valori RGB vengono trasformati in tre componenti:
- Y (luminanza): quanto è chiaro il pixel, in pratica una versione in bianco e nero dell'immagine;
- Cb e Cr (crominanza): quanto il colore si discosta dal grigio verso il blu e verso il rosso.
La trasformazione è reversibile e di per sé non perde informazione. Serve a preparare il passo successivo, sfruttando il fatto che l'occhio è molto più sensibile ai dettagli di luminosità che a quelli di colore.
2. Sottocampionamento della crominanza
Le componenti Cb e Cr vengono spesso memorizzate a risoluzione ridotta:
| Schema | Risoluzione del colore | Uso tipico |
|---|---|---|
| 4:4:4 | piena | grafica, testi, qualità massima |
| 4:2:2 | metà in orizzontale | alcuni flussi fotografici e video |
| 4:2:0 | metà in orizzontale e in verticale | impostazione comune per le foto |
Con 4:2:0 i dati di colore si riducono a un quarto. Su una fotografia la differenza è difficilmente visibile; su un testo rosso su fondo blu, invece, i bordi diventano sbavati. Ecco perché gli screenshot salvati in JPEG mostrano spesso aloni attorno alle scritte colorate.
3. Blocchi di 8 × 8 pixel
Ogni componente viene divisa in blocchi di 8 × 8 campioni, che saranno elaborati indipendentemente. La scelta di blocchi piccoli rende l'algoritmo veloce e poco esigente in memoria; il prezzo è che, a compressione elevata, i confini tra blocchi diventano visibili.
4. La trasformata discreta del coseno (DCT)
Ogni blocco viene trasformato con la DCT, che esprime i 64 valori come somma di 64 "motivi" di base, dal tono uniforme fino a scacchiere sempre più fitte. Il risultato è una matrice di 64 coefficienti:
- il coefficiente in alto a sinistra (detto DC) rappresenta il valore medio del blocco;
- gli altri (detti AC) rappresentano variazioni sempre più fini, cioè frequenze più alte.
In una zona di cielo quasi uniforme, quasi tutta l'energia si concentra nel coefficiente DC e in pochi AC a bassa frequenza; gli altri sono vicini a zero. Anche la DCT, in teoria, è reversibile: la perdita non avviene qui.
5. Quantizzazione: dove si perde informazione
Ogni coefficiente viene diviso per un valore preso da una tabella di quantizzazione e arrotondato all'intero. Le tabelle usano divisori piccoli per le basse frequenze e grandi per le alte. Molti coefficienti ad alta frequenza diventano così esattamente zero.
Il parametro "qualità" che vediamo nei programmi non fa parte dello standard: è una scala definita da ciascun encoder che, di fatto, moltiplica i valori delle tabelle. Per questo «qualità 80» in due programmi diversi non produce necessariamente lo stesso risultato.
6. Ordinamento a zig-zag e codifica
I 64 coefficienti quantizzati vengono letti a zig-zag, dalle basse alle alte frequenze, così che gli zeri finiscano raggruppati in coda. A quel punto:
- i coefficienti DC sono codificati come differenza rispetto al blocco precedente;
- gli AC sono codificati come coppie «quanti zeri, poi quale valore», con un simbolo speciale per «da qui in poi solo zeri»;
- tutto passa infine per una codifica entropica, di solito Huffman.
Il JPEG progressivo organizza i dati in passate successive: prima le basse frequenze di tutta l'immagine, poi i dettagli. Durante il caricamento si vede subito una versione sfocata che si definisce progressivamente, e spesso il file risulta anche un po' più piccolo.
Gli artefatti e come riconoscerli
- Blocchettatura: quadrati di 8 × 8 pixel visibili nelle zone uniformi, dovuti alla quantizzazione forte del coefficiente DC e dei primi AC.
- Ringing (o mosquito noise): aloni e puntini attorno ai bordi netti, perché eliminando le alte frequenze non si riesce più a rappresentare un salto brusco.
- Sbavature di colore: bordi colorati imprecisi, effetto del sottocampionamento.
- Banding nei cieli: la quantizzazione appiattisce le variazioni lievi.
Nel mio lavoro di analisi le tracce della quantizzazione sono anche un indizio prezioso: zone di un'immagine che mostrano griglie di blocchi non allineate con il resto possono rivelare un incollaggio da un'altra foto.
Operazioni sicure e operazioni dannose
| Operazione | Effetto |
|---|---|
| Aprire e risalvare in JPEG | nuova quantizzazione: perdita aggiuntiva |
| Ruotare di 90° con strumenti "lossless" | nessuna perdita, se le dimensioni sono multiple della dimensione dei blocchi |
| Ritagliare con strumenti "lossless" | nessuna perdita, se il ritaglio è allineato ai blocchi |
| Modificare solo i metadati | nessuna perdita |
| Aumentare la qualità di un JPEG già compresso | file più pesante, nessun dettaglio recuperato |
Consigli pratici
- Per le foto da pubblicare, una qualità media-alta con 4:2:0 è un buon compromesso; verificate a occhio su zone uniformi e bordi.
- Per immagini con testo o grafica, usate 4:4:4 o, meglio, un formato senza perdita.
- Conservate il file originale e generate ogni nuova versione da lì, non dall'ultimo JPEG.
In sintesi
- Il JPEG separa luminanza e crominanza e riduce la risoluzione del colore.
- Ogni blocco 8 × 8 viene trasformato con la DCT in coefficienti di frequenza.
- La perdita avviene nella quantizzazione; la "qualità" è una scala specifica di ciascun encoder.
- Blocchettatura, ringing e sbavature di colore sono gli artefatti tipici.
- Ogni risalvataggio aggiunge perdita: lavorate sempre dall'originale.