Masque de QR code : les 8 motifs et les règles de pénalité — featured illustration
Technologie

Masque de QR code : les 8 motifs et les règles de pénalité

6 min de lecture
Créer un QR code

Donnez la même URL à deux générateurs, avec la même version et le même niveau de correction d'erreurs. Les trois repères d'angle sont identiques, les lignes de synchronisation aussi. Mais la zone centrale, où se trouvent les données, peut ressembler à deux images sans rapport. Les deux codes se scannent pourtant, et portent exactement la même chaîne.

La différence tient au masque choisi par chaque encodeur, et ce choix se produit dans une étape que presque personne ne voit.

Les données brutes font de mauvaises images

L'encodage transforme votre contenu en un flux de mots de code, y ajoute des mots de code de correction Reed-Solomon, puis parcourt ce flux dans la matrice en zigzag en partant du coin inférieur droit. La règle de placement est fixe et mécanique. Elle ne prête aucune attention à ce que les bits disent, et le rapport entre mots de données et mots de correction est aussi ce qui plafonne la capacité.

Les bits peuvent donc dire quelque chose de malheureux. Un contenu avec de longues répétitions peut déposer une plage de modules de même couleur dans la grille. Une autre chaîne produit des rayures qui courent sur la moitié de la largeur du symbole. Le pire résultat, c'est quand les données reproduisent accidentellement le rapport de longueurs qui définit un motif de repérage, planté au milieu du code où aucun repère n'a sa place.

Chacun de ces cas casse une partie différente de la lecture. La séquence de scan commence par localiser les trois motifs de repérage, s'en sert pour déduire l'orientation et la taille de module, puis échantillonne la grille cellule par cellule. De grandes zones uniformes ne laissent à la grille d'échantillonnage rien pour se vérifier, si bien que de petites erreurs d'estimation de la taille de module s'accumulent sur tout le symbole. Un quatrième objet en forme de repère rend ambiguë la toute première étape.

Ce que le masque inverse, et ce qu'il ne touche jamais

L'encodeur construit huit versions candidates du même symbole. Pour chacune, il prend un motif géométrique fixe et l'applique en XOR sur la zone de données : là où le motif dit un, le module change de couleur ; là où il dit zéro, le module reste tel qu'encodé.

Les motifs fonctionnels sont exemptés. Repères, séparateurs, lignes de synchronisation, motifs d'alignement, et zones d'information de format et de version sont tous exclus, ce qui explique que ces parties se ressemblent d'un générateur à l'autre.

Les huit motifs sont délibérément dissemblables. Certains basculent selon la parité de ligne et produisent un bandage horizontal. Certains travaillent par colonnes et produisent des bandes verticales. L'un est un damier fin. D'autres engendrent des diagonales de pentes variées, ou des blocs et grilles plus grossiers. L'étendue est le but. Quelle que soit la forme malencontreuse sur laquelle sont tombées les données brutes, au moins l'un des huit a de bonnes chances de la briser.

Quatre règles de pénalité, notées sur chaque candidat

Avec huit candidats terminés en main, l'encodeur note chacun et garde le plus bas. Quatre règles alimentent la note, et chacune correspond à une façon précise dont une lecture peut échouer.

La première règle punit les longues suites d'une même couleur sur une ligne ou une colonne. Une suite de cinq prend une pénalité de base, et chaque module supplémentaire dans cette suite en ajoute. C'est ce qui décourage les larges plages vides.

La deuxième règle compte les blocs 2x2 d'une seule couleur et facture chacun. Les blocs font moins de dégâts que les longues suites, mais ils érodent l'information de bord locale dont un lecteur se sert pour garder sa grille d'échantillonnage honnête.

La troisième règle traque le sosie du repère : ce rapport caractéristique sombre-clair-sombre-clair-sombre avec une large zone claire d'un côté. Elle porte un poids bien supérieur aux trois autres, d'environ un ordre de grandeur, ce qui vous dit comment la norme classe le danger. Un pseudo-repère accidentel pèse plus lourd qu'un gros tas de blocs épars.

La quatrième règle mesure l'équilibre global entre sombre et clair sur tout le symbole et pénalise l'écart à une répartition égale. Un symbole qui sort à 70 pour cent sombre complique la tâche d'un capteur d'image pour fixer son seuil noir-blanc, en particulier sous faible lumière ou sur une impression peu contrastée.

Remarquez ce que la notation ignore : la beauté du résultat. Les pénalités ne concernent que la lisibilité, et le vainqueur est simplement le candidat qui a le moins mal marqué.

Le numéro de masque voyage dans l'information de format

Un décodeur ne peut pas deviner quel masque a été appliqué, il faut donc le lui dire. Trois bits identifiant le masque figurent dans l'information de format, à côté du niveau de correction d'erreurs. Ces bits reçoivent leur propre correction d'erreurs et sont inscrits deux fois dans le symbole, à deux endroits distincts près des repères.

La duplication est délibérée. Perdez l'information de format et le symbole entier devient illisible, quelle que soit l'intégrité de la zone de données, car le lecteur n'a aucun moyen de savoir quel motif retirer. Lire, c'est la même opération qu'écrire : appliquez une seconde fois le masque nommé et les bits d'origine reviennent.

Pourquoi deux générateurs divergent

L'essentiel des différences visuelles entre outils remonte aux marges de ce processus. La notation de pénalité produit un nombre et le plus bas gagne, mais les implémentations diffèrent dans leur gestion des égalités et dans le soin qu'elles mettent à suivre chaque clause des règles de notation. Certains encodeurs sautent l'évaluation et fixent un masque en dur pour la vitesse. La sortie se décode quand même, c'est donc licite, mais l'optimisation est perdue.

Deux codes issus de deux services peuvent donc être tous deux corrects et ne se ressembler en rien. Les comparer module par module n'est pas un test significatif pour l'un ou l'autre. Les scanner, si.

Et en France ?

Une demande revient souvent chez nos utilisateurs français : un QR code bleu, blanc, rouge. Le masque n'y peut rien, il est choisi automatiquement pour la lisibilité et ne se règle pas pour dessiner un motif. Ce sont les couleurs qui décident.

La règle pratique : des modules foncés sur fond clair, avec un contraste fort. Un bleu marine sur blanc se lit très bien. Le rouge, en revanche, est un mauvais choix pour les modules, car certains lecteurs le distinguent mal du blanc. Si vous tenez au tricolore, gardez les modules en bleu foncé et réservez le rouge à un cadre ou à l'appel à l'action autour du code, hors de la zone de silence.

Ce que cela signifie pour un code stylisé

Tout ce que vous ajoutez sur un code terminé arrive après le masquage. L'encodeur a optimisé la répartition des modules sans savoir qu'un logo viendrait s'y poser : ce sont donc les réserves de correction d'erreurs qui compensent les modules masqués, pas le masque. C'est la vraie raison pour laquelle un logo doit rester au centre et de taille raisonnable, plutôt que de glisser vers un angle où il risque de rogner un repère ou sa bordure.

Les traitements de couleur et de forme fonctionnent pareil. Les coins arrondis et les modules en pastille adoucissent précisément les bords que les deux premières règles de pénalité existent pour préserver, et une palette peu contrastée travaille contre la quatrième. Les codes se lisent généralement quand même, car la correction d'erreurs laisse de la marge, mais vous dépensez une marge que le masque a déjà dépensée une fois pour vous. Les choix de design d'un code personnalisé sont bon marché isolément et chers empilés à trois. Quand une version stylisée échoue et qu'une version simple réussit sur un contenu identique, c'est normalement de là que cela vient, et il vaut mieux diagnostiquer l'échec avant que le fichier n'approche d'un tirage.

Partager cet article