SWAPQR← Guida

Codici QR con dithering: come una fotografia diventa un codice leggibile

La maggior parte dei codici QR "artistici" è un'immagine con un codice stampato sopra. Un codice QR con dithering è un'altra cosa: c'è una sola immagine, e il codice fa parte della sua grana. Questo articolo spiega di cosa ha davvero bisogno un codice, come funziona il dithering a diffusione d'errore, l'unica modifica che permette ai due di condividere un quadrato, le due impostazioni che decidono il risultato, e i tre modi in cui fallisce.

Crea un codice QR nel browser →Stampa il quadrato una volta sola. Decidi dopo dove porta.

Parti da ciò di cui un codice QR ha davvero bisogno

Un codice QR è una griglia di moduli — piccoli quadrati che sono scuri o chiari. Alcuni sono strutturali e non possono spostarsi: i tre grandi quadrati negli angoli che permettono a uno scanner di trovare e orientare il codice, la sottile linea alternata tra di essi, i piccoli quadrati di allineamento, e le strisce che codificano formato e versione. Tutto il resto è dati più byte di correzione d'errore. Quella correzione d'errore è la porta d'ingresso. Al livello più alto, circa il 30% del codice può essere distrutto e un lettore recupererà comunque il contenuto. Quindi un codice non deve essere perfetto. Deve essere perfetto dove conta, e abbastanza vicino ovunque altrove. Tieni a mente questa distinzione, perché l'intera tecnica si regge su di essa: i moduli strutturali sono trattati come intoccabili, e l'area dati è trattata come qualcosa che deve essere giusto solo in media, alla scala a cui la vede una fotocamera. Ogni generatore che mette un'immagine in un codice spende parte di quel budget del 30%; la domanda è solo con quanta cura lo spende, e se l'occhio può vederne il costo.

Il dithering, in un paragrafo

Il dithering Floyd–Steinberg trasforma una fotografia in scala di grigi in puro bianco e nero. Percorri i pixel in ordine. Per ciascuno scegli il più vicino tra nero e bianco, poi prendi l'errore che hai appena commesso — la differenza tra il grigio che volevi e il valore che hai messo — e lo spingi nei vicini che non hai ancora visitato, pesato 7/16 al pixel a destra e 3/16, 5/16 e 1/16 ai tre pixel sotto. Ognuno di quei vicini parte poi da un valore leggermente corretto quando arriva il suo turno, così l'errore non va mai perso, solo spostato. L'immagine viene fuori come un campo di puntini la cui densità locale corrisponde alla luminosità originale: una regione di grigio medio diventa circa metà punti neri, una luce diventa punti radi su bianco, un'ombra diventa punti bianchi radi su nero. Vista da lontano, l'occhio rimedia i puntini in tono, ed è per questo che un'immagine con dithering si legge come una fotografia anche se ogni suo pixel è uno di soli due colori. Quella media è la stessa cosa che fa una fotocamera quando guarda una piccola stampa, ed è ciò che la tecnica sfrutta.

Il trucco

Renderizza il codice a un numero fisso di pixel per modulo — SWAPQR ne usa nove, quindi ogni modulo è un blocco 9×9. Poi applica il dithering alla fotografia sull'intero quadrato, con una modifica: dove il codice richiede un valore specifico, non applicare la soglia. Forza il pixel a ciò di cui il codice ha bisogno, misura l'errore che quella forzatura ha causato, e diffondilo esattamente come faresti con qualsiasi altro errore. Quest'ultima frase è l'intera idea. I punti forzati non sono dipinti sopra l'immagine; sono pagati dai pixel intorno a loro, che si spostano per compensare. Finiscono dentro la stessa texture sale-e-pepe di tutto il resto, quindi l'occhio non ha nulla per separarli. I moduli strutturali — finder, timing, allineamento, formato — sono disegnati pieni e intoccati, perché uno scanner deve trovare il codice prima che la correzione d'errore possa aiutarlo. La tecnica qui descritta segue l'approccio pubblicato da Andrew T., che ha documentato la generazione di QR con dithering nel 2026; l'implementazione di SWAPQR è stata scritta dalla descrizione anziché portata dal suo codice sorgente.

Due manopole che decidono tutto

La prima è quanta parte di ogni modulo viene forzata. Forza solo il pixel centrale e l'immagine è quasi intatta, ma il codice è fragile: un pixel per modulo deve sopravvivere a ogni passaggio di ricampionamento tra la stampante e il sensore della fotocamera. Forza un blocco 7×7 su 9×9 e il codice è robusto e l'immagine è tenue, perché la maggior parte di ogni modulo è ora piena. SWAPQR espone questo direttamente come un bilanciamento Foto ↔ Codice, con posizioni Foto, Medio e Codice, così che il compromesso sia una scelta che fai tu anziché una costante nascosta nel generatore. La seconda è di quanto viene spinto ogni modulo. Prima del dithering, ogni pixel di un modulo scuro viene leggermente scurito e ogni pixel di un modulo chiaro leggermente schiarito. L'immagine mantiene i suoi dettagli, ma il tono medio del modulo pende dalla parte giusta — che è ciò che vede una fotocamera quando guarda un piccolo codice stampato dall'altra parte di una stanza. Insieme, le due impostazioni decidono se il risultato è una fotografia con un codice tenue dentro o un codice con una fotografia tenue dentro, e dove su quella linea dovrebbe collocarsi una data stampa dipende da come verrà scansionata.

Dove si rompe, e se ne vale la pena

Tre modalità di fallimento, tutte reali, nessuna misteriosa. Una fotografia piatta: un'immagine illuminata uniformemente e a tono unico si trasforma con il dithering in una scacchiera regolare, che è esattamente la texture che compete con il codice, quindi le immagini hanno bisogno di una vera gamma dal chiaro allo scuro e lo studio avvisa quando una non ce l'ha. Un link lungo: più caratteri significano più moduli nello stesso quadrato, quindi ogni modulo riceve meno immagine; oltre la versione 8 circa — 49×49 moduli — la fotografia non ha dove vivere, e un breve link di reindirizzamento è la soluzione. E il primissimo piano estremo su alcuni lettori, che è abbastanza controintuitivo da avere un articolo tutto suo in questa guida. Un codice artistico è sempre un compromesso contro l'affidabilità. Si guadagna il suo posto dove il codice fa parte del design e qualcuno lo scansionerà deliberatamente — un manifesto, una copertina di album, una confezione, un biglietto da visita. Non ha posto su un cartello di uscita antincendio. Qualunque sia il contesto, testa il pezzo stampato con un telefono vero prima di ordinarne mille; lo studio dice la stessa cosa accanto al pulsante di esportazione, e lo intende sul serio.

Parte del codiceTrattamento in un codice con ditheringPerché
Finder pattern (tre quadrati negli angoli)Disegnati pieni, mai con ditheringLo scanner deve individuare e orientare il codice prima di ogni altra cosa
Linea di timing, quadrati di allineamento, strisce di formato e versioneDisegnati pieni, mai con ditheringStrutturali; la correzione d'errore non può riparare un codice che non viene trovato
Moduli dati e di correzione d'erroreUn blocco centrale di ogni modulo forzato, il resto porta la fotoIl tono medio del modulo è ciò che una fotocamera vede alla distanza di scansione
Pixel intorno a un blocco forzatoSpostati dalla diffusione d'errore per compensareMantiene giusta la media locale così i punti forzati si nascondono nei puntini
Zona di quieteChiara, intoccataGli scanner usano il margine vuoto per trovare il bordo del codice

Domande frequenti

La foto è semplicemente messa dietro il codice?

No. Il codice e la foto sono prodotti in un unico passaggio: l'immagine viene sottoposta a dithering, e dove il codice ha bisogno di un valore il pixel viene forzato e il suo errore diffuso nei vicini. C'è una sola immagine, non un livello sopra un altro.

Perché nove pixel per modulo?

Dà a ogni modulo un blocco 9×9, abbastanza grande da contenere un nucleo forzato di dimensione variabile e lasciare comunque pixel per l'immagine. L'impostazione di bilanciamento decide quanta parte di quel blocco viene forzata.

Si legge con i telefoni normali?

Sì, per i contenuti e le immagini per cui è progettato, e ogni build viene verificata con due decodificatori indipendenti a sette distanze di fotocamera simulate. Resta comunque un compromesso contro l'affidabilità, quindi stampane uno e testalo con il tuo telefono.

Perché un link lungo rovina l'immagine?

Un testo più lungo significa una versione superiore, quindi più moduli e più piccoli nello stesso quadrato. Ogni modulo ha meno spazio per i pixel della foto, e oltre circa 49×49 moduli l'immagine sparisce. Usa un breve link di reindirizzamento.

Stampa il quadrato una volta sola. Decidi dopo dove porta. SWAPQR crea codici QR statici gratis, con tutte le opzioni di stile, senza account e senza filigrana. Un piano a pagamento rende un codice dinamico: il quadrato stampato resta identico mentre tu ne cambi la destinazione, e vedi quante volte è stato scansionato, per giorno e per dispositivo.

Crea un codice QR nel browser
Lingua: TR EN DE ES FR IT PT AR RU JA KO