“Comprimi questa immagine” sono quattro operazioni distinte travestite da un unico pulsante. Sapere quale delle quattro ti costa qualità rende le impostazioni molto meno misteriose.
Passo uno: la decodifica
Il file compresso viene riportato a una griglia di pixel. I browser lo fanno in codice nativo, con accelerazione hardware dove la piattaforma la offre, e gestiscono JPEG, PNG, WebP e AVIF — più l’HEIC sulle piattaforme Apple, perché il sistema operativo include già quel decodificatore.
Rispetto al file, la decodifica è senza perdite: ottieni esattamente i pixel che il file descrive. La perdita è già avvenuta prima, quando qualcosa ha codificato quel file.
Passo due: l'orientamento
Le fotocamere dei telefoni salvano l’orientamento grezzo del sensore più un tag EXIF separato che dice come ruotarlo. I programmi che ignorano quel tag producono foto coricate. Applicarlo significa ruotare la griglia di pixel vera e propria prima che qualsiasi altra cosa la tocchi — dopodiché il tag non serve più, ed è una delle ragioni per cui la ricodifica fa cadere i metadati.
Passo tre: il ricampionamento
Se l’obiettivo di dimensione non si può raggiungere a piena risoluzione, l’immagine viene rimpicciolita. È qui che si vince o si perde in silenzio buona parte della qualità percepita. Un filtro a media semplice fa la media dei pixel vicini e ammorbidisce tutto; un filtro Lanczos pesa un intorno più ampio e tiene i bordi netti.
Il ricampionamento è davvero distruttivo — i pixel scartati non tornano — ma spesso è il modo meno distruttivo di arrivare a un obiettivo piccolo, perché toglie di mezzo un dettaglio che altrimenti l’encoder spenderebbe tutto il suo budget a descrivere senza riuscirci.
Passo quattro: la codifica
La parte con perdita. Il JPEG converte in una rappresentazione fatta di luminosità più colore, butta via parte della risoluzione cromatica (l’occhio quasi non se ne accorge), divide l’immagine in blocchi da 8×8, trasforma ciascun blocco in componenti di frequenza e poi quantizza, cioè arrotonda via il dettaglio ad alta frequenza. Il parametro della qualità è la grossolanità di quell’arrotondamento. Tutto quello che viene dopo è codifica entropica senza perdite, ed è il motivo per cui una tabella di Huffman ottimizzata o una scansione progressiva fanno risparmiare byte gratis.
Dove entra in gioco WebAssembly
L’encoder integrato nel browser è una scatola nera: puoi chiedere un numero di qualità e nient’altro. Nessuna tabella entropica ottimizzata, nessuna scelta tra baseline e progressivo, nessun controllo sul filtro di ricampionamento e nessun modo di sapere quanti byte produrrà un’impostazione senza provarla.
Un codec compilato in WebAssembly restituisce tutto questo, al prezzo dei byte che spendi per scaricarlo. ToolZool esegue l’intera catena in quel modo — decodifica, orientamento, ricampionamento e codifica sono tutti Rust compilato in WebAssembly, dentro un worker in secondo piano — invece di affidare la decodifica al browser. Le ragioni sono tre, tutte pratiche:
- La ricerca richiede molte codifiche. Arrivare a una dimensione esatta significa codificare la stessa immagine cinque o sei volte. Avere l’encoder in casa è ciò che rende questa cosa economica e ripetibile.
- Un decodificatore deve poter dire di no. Un file che dichiara 60.000 × 60.000 pixel va rifiutato prima di allocare memoria, e un file troncato deve fallire invece di restituire mezza immagine. Il decodificatore del browser decide da sé come comportarsi; il nostro dichiara i limiti e li fa rispettare.
- Lo stesso input deve dare lo stesso output. I decodificatori dei browser differiscono nella gestione del colore e nel modo in cui trattano i file malformati. Una catena che possiede entrambe le estremità produce gli stessi byte su qualunque dispositivo, ed è questo che rende un risultato verificabile.
Il costo è dichiarato: quel motore è un download. Viene scaricato solo nel momento in cui scegli un file, quindi leggere una pagina come questa non lo paga mai.
Perché la ricerca conta più del codec
Dato un obiettivo di dimensione, la differenza tra un buon encoder e uno eccellente è qualche punto percentuale. La differenza tra tirare a indovinare su un cursore della qualità e cercare quello giusto è molto più grande, perché una stima che si ferma al 60% di quanto avevi a disposizione ha buttato via un terzo della qualità a cui avevi diritto. È tutta qui l’idea dietro comprimere a una dimensione esatta, e rientrare in un limite di 50 KB mostra cosa ti fa guadagnare la ricerca nella parte più difficile dell’intervallo.

