Un codice QR è semplicemente una griglia di quadratini neri e bianchi che la fotocamera legge come una lunga sequenza di uni e zero. I tre quadrati grandi negli angoli dicono al telefono dov'è il codice e in che verso sta, mentre il resto del disegno contiene i dati più copie di riserva integrate, che permettono al codice di sopravvivere a graffi, macchie e adesivi. Ecco come funziona ogni pezzo, spiegato in parole semplici.
Dall'immagine della fotocamera alla griglia di moduli
Quando punti la fotocamera su un codice QR, il primo compito dell'app è trasformare una foto in qualcosa che un computer possa elaborare. L'immagine viene convertita in bianco e nero applicando una soglia di luminosità: tutto ciò che è più scuro della soglia diventa nero, tutto ciò che è più chiaro diventa bianco. Le foto sfocate o in ombra rendono questo passaggio più difficile, ed è per questo che un codice nitido e ben illuminato si scansiona in modo più affidabile.
Il quadratino più piccolo del disegno si chiama modulo. Per il lettore, ogni modulo è un singolo bit di informazione: un modulo scuro è un valore binario, uno chiaro l'altro. Tutto il resto, dai grandi quadrati d'angolo ai dati stessi, è solo un insieme di moduli disposti su una griglia.
Intorno al codice c'è un margine bianco chiamato quiet zone, largo per convenzione quattro moduli. Offre alla fotocamera un bordo pulito da individuare e separa il codice da sfondi affollati. Un codice stampato a ridosso di altre grafiche è più difficile da scansionare proprio per questo motivo.
I tre finder pattern
Nei tre angoli — in alto a sinistra, in alto a destra e in basso a sinistra — si trova la caratteristica più riconoscibile di un codice QR: un grande quadrato formato da anelli concentrici, con un anello esterno scuro, un anello chiaro e un centro pieno scuro di 3×3 moduli. Sono i finder pattern, o pattern di riferimento, e risolvono il primo problema che ogni scanner deve affrontare: dov'è il codice, e in che verso sta?
Lo scanner li individua facendo scorrere una linea sull'immagine e cercando un ritmo molto preciso. Una linea che attraversa il centro di un finder pattern incontra scuro, chiaro, scuro, chiaro, scuro con larghezze nel rapporto 1:1:3:1:1 — un modulo scuro, uno chiaro, tre scuri, poi di nuovo uno e uno. Questa firma è abbastanza inusuale da distinguersi da quasi qualsiasi altra cosa in una foto.
Perché tre finder e non quattro? Tre angoli bastano a fissare la posizione di un quadrato, e l'angolo mancante ha un significato: indica al lettore qual è il lato "in alto". Anche se scansioni un codice capovolto o di lato, il lettore sa esattamente come ruotare la griglia prima di decodificarla.
Pattern di timing e di allineamento
Sapere dove sono gli angoli non basta. Se il codice è stato fotografato di angolo o stampato su una superficie curva, la griglia nel mezzo può risultare stirata o inclinata. Due altre strutture la tengono a posto.
Il pattern di timing è una linea tratteggiata di moduli scuri e chiari alternati che corre tra i finder pattern — uno lungo il lato superiore, uno lungo il lato sinistro. Funziona come un righello: contando le alternanze, il lettore conferma la dimensione esatta dei moduli e come la griglia deve distanziarsi su tutto il codice.
Il pattern di allineamento è un quadrato concentrico più piccolo, di cinque moduli per lato, che compare dalla versione 2 in poi, collocato verso l'angolo in basso a destra. I codici più grandi ne portano diversi. Ognuno fa da punto di riferimento supplementare, permettendo al lettore di misurare e correggere le distorsioni nella sua parte di griglia — indispensabile quando un codice avvolge una bottiglia o sta su un'etichetta leggermente stropicciata.
Le versioni da 1 a 40
I codici QR esistono in 40 dimensioni, chiamate versioni. La versione 1 è una griglia di 21×21 moduli. Ogni versione successiva aggiunge quattro moduli per lato, così la versione 2 è 25×25, la versione 3 è 29×29, e così via fino alla versione 40 a 177×177.
Una griglia più grande significa più spazio per i dati. Come regola pratica, le versioni più grandi possono contenere circa 7.000 cifre, mentre un URL breve entra comodamente in un codice molto più piccolo. La capacità esatta dipende anche da ciò che si codifica — i numeri si comprimono meglio del testo — e dal livello di correzione degli errori scelto.
È anche per questo che i codici generati variano così tanto nell'aspetto. Gli strumenti di generazione scelgono la versione più piccola che contiene il contenuto, quindi un link breve produce un codice rado e tozzo, mentre uno lungo produce un disegno denso e fitto.
Codeword di dati e di correzione degli errori
Una volta che le strutture di supporto hanno occupato il loro spazio, l'area rimanente contiene il carico utile. I bit sono raggruppati in unità di otto moduli chiamate codeword: ognuna è un singolo byte di informazione.
Ce ne sono di due tipi. I codeword di dati portano il contenuto vero e proprio: l'URL, il testo o qualsiasi altra cosa codifichi il codice. I codeword di correzione degli errori sono copie di riserva di un tipo particolare, calcolate a partire dai dati con un ramo della matematica chiamato codice di Reed–Solomon — la stessa famiglia di tecniche che proteggeva i dati su CD e DVD. Il lettore le usa per verificare i dati e riparare eventuali parti mancanti.
I codici QR offrono quattro livelli di correzione degli errori, chiamati L, M, Q e H. A grandi linee, riescono a ricostruire rispettivamente circa il 7%, il 15%, il 25% o il 30% dei codeword. Il compromesso è lo spazio: più alto è il livello, più parte del codice è riservata alle copie di riserva e meno resta per i dati, quindi lo stesso contenuto può richiedere una versione più grande.
Ecco perché un codice QR con un logo sovrapposto al centro può comunque scansionare: chi l'ha progettato ha scelto un livello di correzione alto e ha lasciato che i codeword di riserva assorbissero la zona coperta.
La mascheratura (masking)
Lasciati al caso, i dati grezzi potrebbero produrre una griglia dall'aspetto sfortunato: ampie chiazze vuote, o gruppetti di quadratini che imitano per caso un finder pattern e confondono lo scanner. La soluzione è la mascheratura.
Lo strumento di codifica prende uno degli otto pattern di maschera predefiniti — scacchiere, strisce orizzontali o verticali e simili disegni ripetitivi — e inverte ogni modulo dove la maschera ha un quadrato scuro. I dati non cambiano; cambia solo il loro aspetto, e l'inversione è perfettamente reversibile.
Lo strumento prova tutte e otto le maschere, assegna un punteggio a ogni risultato con regole di penalità (lunghe sequenze dello stesso colore, imitazioni dei finder pattern, aree scure e chiare troppo sbilanciate) e tiene quella con la penalità più bassa. Quale maschera sia stata usata è registrato in una piccola fascia di informazioni di formato accanto ai finder — scritta due volte per sicurezza, così un angolo rovinato non lascia il lettore all'oscuro.
È anche per questo che lo stesso link codificato con due strumenti diversi può produrre due codici visivamente differenti. Entrambi sono corretti: hanno semplicemente scelto maschere diverse.
Un piccolo esempio pratico
Prendi il testo "HI". L'encoder scrive prima alcuni bit di configurazione — che tipo di dati seguono e quanto sono lunghi — e poi il contenuto stesso. Ogni carattere è memorizzato in otto bit: H diventa 01001000 e I diventa 01001001. Quei sedici bit diventano sedici moduli sulla griglia, un bit ciascuno.
I bit vengono disposti nella griglia a strisce di due colonne che serpeggiano su e giù partendo dall'angolo in basso a destra, saltando le aree dei finder, del timing e delle informazioni di formato. Dopo i dati arriva un blocco di codeword di correzione degli errori, calcolati a partire dai dati e inseriti accanto. Infine viene applicata la maschera scelta, invertendo alcuni moduli per rompere eventuali pattern sfortunati.
Questa è tutta la ricetta: prima la struttura, poi i dati, poi le copie di riserva, infine la maschera. Ogni codice QR che hai mai scansionato è questa stessa procedura ripetuta su scala maggiore.
Il punto chiave
Un codice QR è un'immagine che si descrive da sola. I finder pattern dicono "eccomi, e questo è il lato in alto"; i pattern di timing e di allineamento raddrizzano la griglia; la versione ne fissa la dimensione; i codeword portano i tuoi dati con copie di riserva integrate; e la mascheratura tiene il disegno leggibile. La prossima volta che ne scansioni uno — o ne generi uno tuo su QRCodeMax.Vip — ingrandisci l'immagine e riconoscerai ognuna di queste parti al lavoro.