Anatomie d'un QR code : repères, alignement et synchronisation — featured illustration
Technologie

Anatomie d'un QR code : repères, alignement et synchronisation

6 min de lecture
Créer un QR code

Retournez un QR code, il se scanne toujours. Photographiez-le de biais, enroulez-le autour d'une bouteille, surprenez-le dans le reflet d'une vitrine : un décodeur le trouve quand même, le redresse et le lit. Cette tolérance ne vient pas d'un logiciel malin qui compense une mauvaise image. Elle est inscrite dans le dessin même du code.

La plupart des modules d'un QR code portent des données. Une minorité porte de la structure, et ce sont eux qui rendent le reste lisible.

Les trois carrés d'angle

Ce que l'on remarque en premier, ce sont les motifs de repérage : trois carrés concentriques installés dans trois des quatre coins. Chacun occupe 7x7 modules et s'organise en trois couches, un anneau sombre de 7x7, un anneau clair de 5x5 juste à l'intérieur, puis un noyau sombre plein de 3x3.

Les proportions sont l'essentiel. Tracez n'importe quelle droite passant par le milieu d'un motif de repérage et vous croisez sombre, clair, sombre, clair, sombre dans un rapport de largeurs 1:1:3:1:1. À l'horizontale, à la verticale et en diagonale, le rapport tient. Un décodeur balaie des lignes sur l'image en cherchant exactement cette suite de cinq, ce qui est peu coûteux à tester et fonctionne à toute échelle, puisqu'un rapport se moque de savoir si le code fait 15 mm sur une carte de visite ou deux mètres sur un mur.

Trois occurrences donnent trois points, et trois points définissent un plan. Le décodeur en tire position, échelle et rotation avant d'avoir lu le moindre bit. Chaque motif de repérage est aussi entouré, sur ses bords intérieurs, d'un séparateur clair d'un module de large, qui empêche les modules de données de toucher le motif et de corrompre le rapport.

Pourquoi le quatrième coin reste vide

Trois carrés, pas quatre, et l'omission est délibérée. Trois points disposés aux sommets d'un triangle rectangle n'ont qu'un seul sommet à angle droit, et ce sommet marque le coin supérieur gauche du symbole. La rotation est résolue immédiatement.

Mettez un quatrième motif dans le coin restant et vous obtenez une figure à symétrie d'ordre quatre, sans moyen de savoir où est le haut. Chaque scan porterait quatre orientations candidates, et le décodeur devrait les essayer tour à tour. Le coin vide fait un vrai travail en n'étant pas là.

Motifs d'alignement et surfaces courbes

Les motifs d'alignement sont les petits carrés disséminés dans les codes plus grands : 5x5 modules, un anneau extérieur sombre, un anneau intérieur clair, un module sombre au centre.

La version 1 n'en a pas, car une grille de 21x21 est assez petite pour que les trois motifs de repérage la fixent. À partir de la version 2 apparaît un unique motif d'alignement vers le bas à droite. Le nombre grimpe avec la version, jusqu'à quarante-six dans les plus grandes tailles, les centres étant disposés sur une grille carrée, les trois positions qui entreraient en conflit avec les motifs de repérage étant simplement omises.

Ce qu'ils corrigent, c'est une distorsion non uniforme. Les trois motifs de repérage permettent au décodeur de projeter un rectangle plat, mais une vraie photo est rarement un rectangle plat : l'appareil est de biais, l'étiquette épouse une canette, le papier porte un pli, l'objectif courbe les bords du cadre. Les motifs d'alignement donnent au décodeur des points de référence connus à l'intérieur, pour corriger la grille localement au lieu de supposer une transformation globale unique. Sans eux, un grand symbole lu de biais dériverait hors registre au coin opposé, et chaque module au-delà serait échantillonné au mauvais endroit. La façon dont leur nombre croît avec la version, et l'effet sur la taille physique du module, méritent d'être lus ensemble.

Les motifs de synchronisation posent la règle graduée

Entre les motifs de repérage courent une rangée et une colonne de modules sombres et clairs alternés, larges d'un module, à un décalage fixe du coin supérieur gauche. C'est le motif de synchronisation, et c'est l'élément le moins décoratif du symbole.

Son rôle est d'établir le pas des modules. Savoir où se trouve le code ne suffit pas ; le décodeur doit aussi savoir quelle largeur fait un module et où tombe chaque frontière. La suite alternée lui donne une règle graduée à chaque module, ce qui lui permet de compter les positions à travers le symbole et de rester en phase même quand l'échelle dérive légèrement sur l'image à cause de la perspective.

Il y a là une petite élégance de conception. Quand, dans les grandes versions, un motif d'alignement se trouve sur la rangée ou la colonne de synchronisation, sa propre structure alternée s'aligne sur le rythme au lieu de l'interrompre.

Informations de format et de version

Deux autres zones réservées portent des métadonnées plutôt que de la charge utile.

L'information de format enveloppe les motifs de repérage : quinze bits consignant le niveau de correction d'erreurs et lequel des huit masques a été appliqué. Elle figure dans toutes les versions, et elle est stockée deux fois à deux emplacements distincts avec sa propre détection d'erreurs, car un décodeur incapable de lire les bits de format ne peut rien lire du tout. Le niveau de correction qui s'y trouve consigné a de vraies conséquences sur la tolérance aux dégâts et la capacité, et c'est le réglage qui décide de la quantité de graphisme qu'un code avec logo peut supporter.

L'information de version est la paire de blocs 6x3 près des motifs de repérage en haut à droite et en bas à gauche, et elle n'existe qu'à partir de la version 7. Les symboles plus petits n'en ont pas besoin, le nombre de modules suffisant à identifier la version.

Un module unique à côté de la zone de format en bas à gauche est toujours sombre, dans tous les symboles jamais fabriqués. Il ne porte aucun message ; c'est une référence fixe.

Le masquage, et pourquoi des données identiques peuvent différer visuellement

La zone de données n'est pas écrite brute. L'un des huit masques est appliqué par un ou exclusif, inversant un sous-ensemble régulier des modules. L'encodeur produit des candidats, note chacun selon des règles de pénalité, et garde le meilleur.

Les règles pénalisent les longues suites d'une même couleur, les grands aplats, et un déséquilibre entre sombre et clair. Une règle pèse plus que les autres : toute suite dans les données imitant le rapport 1:1:3:1:1 des motifs de repérage est lourdement pénalisée, car un faux motif de repérage au milieu de la zone de données enverrait le décodeur à la recherche d'un symbole inexistant.

C'est pourquoi un même contenu peut produire des codes visiblement différents selon le niveau de correction, et pourquoi la texture visuelle d'un code n'est pas quelque chose que vous réglez directement. Sous le masque, les données sont inscrites dans les modules restants selon un zigzag large de deux modules qui part en bas à droite et remonte, puis redescend, puis remonte, en sautant chaque zone réservée décrite plus haut.

Et en France ?

Toutes les règles décrites ici viennent de la norme internationale ISO/IEC 18004, qui définit le QR code : dimensions des repères, position des motifs d'alignement, largeur de la zone de silence. En France, les normes ISO se procurent notamment auprès de l'AFNOR, qui les diffuse.

Vous n'avez pas besoin de la lire pour créer un bon code, mais elle devient utile dans un cahier des charges. Pour un marché public ou un contrat d'impression, citer la norme ISO/IEC 18004 et exiger une zone de silence de quatre modules donne un critère objectif pour refuser un lot de codes mal imprimés.

La zone de silence fait partie du symbole

Quatre modules de marge vide sur chaque côté, sans rien à l'intérieur. Ce n'est pas un caprice de graphiste amateur d'espace blanc : c'est une partie du symbole définie par la norme, que le décodeur utilise pour savoir où le code se termine et où le fond commence.

Serrez contre elle du texte, un filet d'encadrement ou une photo chargée, et la recherche du rapport 1:1:3:1:1 peut prendre le visuel environnant pour une partie du motif. Les codes qui échouent ainsi paraissent souvent parfaitement corrects à un humain, ce qui explique le temps qu'il faut pour repérer la cause. C'est une entrée permanente sur toute liste de raisons pour lesquelles un code ne se scanne pas, et la plus facile à corriger.

Essayez sur quelque chose que vous avez déjà produit : zoomez jusqu'à voir les modules un par un, posez une règle en travers d'un carré d'angle, et vérifiez que les bandes sombres et claires sortent bien à 1:1:3:1:1. Sinon, le visuel a été étiré de façon non uniforme, et aucune correction d'erreurs ne le sauvera. La séquence de lecture commence et finit par ce rapport.

Partager cet article