Ritagliare un oggetto e appoggiarlo su uno sfondo diverso sembra un'operazione banale, finché non compaiono bordi scuri, aloni chiari o sfumature che diventano opache. Questi problemi nascono quasi sempre da un fraintendimento su come il canale alfa rappresenta la trasparenza e su come i programmi combinano i livelli. Il tema si chiama compositing ed è alla base di fotoritocco, interfacce grafiche, effetti video e motori di gioco.
Cosa rappresenta l'alfa
Il canale alfa è un quarto valore associato a ogni pixel, accanto a rosso, verde e blu. Indica la copertura: quanta parte del pixel è occupata dall'oggetto.
- alfa = 1 (o 255 a 8 bit): il pixel è interamente coperto, opaco;
- alfa = 0: il pixel è vuoto, completamente trasparente;
- valori intermedi: il pixel è coperto solo in parte, come accade ai bordi antialiasati, ai capelli, al vetro, al fumo.
L'alfa non è un colore, e un pixel con alfa zero non ha, a rigore, un colore significativo. Questa osservazione, apparentemente filosofica, è la chiave di molti difetti pratici.
L'operatore «over»
Il caso più comune è appoggiare un livello in primo piano (F) su uno sfondo (B). Con valori normalizzati tra 0 e 1, e uno sfondo opaco, la formula è:
risultato = F.colore × F.alfa + B.colore × (1 − F.alfa)
Un pixel di bordo con alfa 0,3 prende il 30% del colore dell'oggetto e il 70% di quello dello sfondo. Questa operazione, insieme ad altre come in, out, atop e xor, fu formalizzata da Thomas Porter e Tom Duff in un articolo del 1984 dedicato al compositing di immagini digitali, ed è tuttora la base dei sistemi grafici.
Alfa diretto e alfa premoltiplicato
Esistono due modi di memorizzare un pixel trasparente:
| Rappresentazione | Cosa contiene il colore | Esempio: rosso al 50% |
|---|---|---|
| Alfa diretto (straight) | il colore "puro" dell'oggetto | (1, 0, 0, 0,5) |
| Alfa premoltiplicato | colore già moltiplicato per alfa | (0,5, 0, 0, 0,5) |
Con l'alfa premoltiplicato la formula «over» diventa più semplice:
risultato = F + B × (1 − F.alfa)
I vantaggi non sono solo di velocità:
- Filtraggio corretto: quando si ridimensiona, si sfoca o si ruota un'immagine trasparente, si fanno medie tra pixel. Con l'alfa diretto, la media tra un pixel rosso opaco e un pixel trasparente "nero" (0, 0, 0, 0) produce un colore scurito. Con il premoltiplicato, il pixel trasparente vale zero in tutti i canali e non contamina il risultato.
- Composizione associativa: si possono unire più livelli in gruppi intermedi senza cambiare il risultato finale.
- Luci additive: un pixel con colore non nullo e alfa zero rappresenta una luce che si somma senza coprire, utile per bagliori e fuoco.
Per questo molti motori grafici e programmi di compositing lavorano internamente con alfa premoltiplicato, anche se i file PNG, per specifica, memorizzano l'alfa diretto.
Gli aloni: diagnosi e rimedi
Bordo scuro attorno a un ritaglio. Tipico di un'immagine con alfa diretto, filtrata o ridimensionata senza premoltiplicare: i pixel trasparenti avevano colore nero e sono "colati" nei bordi. Rimedio: premoltiplicare prima di filtrare, oppure riempire i pixel trasparenti con il colore dei bordi vicini (tecnica detta dilatazione o bleeding), molto usata per le texture dei videogiochi.
Bordo chiaro attorno a un oggetto scontornato da un fondo bianco. I pixel di bordo contengono ancora una parte del colore dello sfondo originale. Rimedio: le funzioni di "decontaminazione del colore" o di rimozione dell'alone presenti nei programmi di ritocco, che stimano e sottraggono il contributo dello sfondo.
Doppia moltiplicazione. Se un'immagine già premoltiplicata viene trattata come diretta, i bordi diventano troppo scuri e le sfumature trasparenti troppo deboli. Accade quando due componenti di una catena fanno ipotesi diverse: va chiarito quale formato si aspetta ciascuno.
Metodi di fusione
Oltre alla semplice sovrapposizione, i programmi offrono metodi di fusione (blend mode) che combinano i colori in modo diverso. I più usati:
- Moltiplica: F × B; scurisce sempre, il bianco è neutro. Utile per ombre e per applicare texture.
- Scolora (screen): 1 − (1 − F) × (1 − B); schiarisce sempre, il nero è neutro. Utile per luci e bagliori.
- Sovrapponi (overlay): moltiplica nelle zone scure dello sfondo e scolora in quelle chiare; aumenta il contrasto.
- Differenza: |F − B|; utile per confrontare due versioni di un'immagine, perché ciò che è identico diventa nero.
Il metodo Differenza è uno strumento che uso spesso nel mio lavoro per individuare modifiche tra due versioni di un'immagine: anche variazioni di un solo livello di valore diventano visibili aumentando il contrasto del risultato.
Va ricordato che anche i metodi di fusione risentono della gamma: lo stesso metodo applicato in spazio sRGB o in spazio lineare dà risultati diversi.
Formati che supportano la trasparenza
- PNG: alfa completo a 8 o 16 bit, oppure trasparenza semplice tramite il chunk tRNS.
- GIF: un solo colore trasparente, senza livelli intermedi: per questo i bordi sono seghettati.
- WebP e AVIF: alfa completo, anche con compressione con perdita.
- TIFF e OpenEXR: alfa completo, usati nei flussi professionali.
- JPEG: nessun canale alfa.
In sintesi
- Il canale alfa rappresenta la copertura di ogni pixel, da 0 (vuoto) a 1 (opaco).
- L'operatore «over» mescola primo piano e sfondo in proporzione all'alfa.
- L'alfa premoltiplicato rende corretti filtraggi e ridimensionamenti ed evita bordi scuri.
- Gli aloni chiari derivano dallo sfondo originale e si rimuovono con la decontaminazione del colore.
- I metodi di fusione come moltiplica, scolora e differenza combinano i colori in modi specifici.