Codes QR tramés : comment une photographie devient un code scannable
La plupart des codes QR « artistiques » sont une image avec un code tamponné par-dessus. Un code QR tramé est autre chose : il n'y a qu'une seule image, et le code fait partie de son grain. Cet article explique ce dont un code a réellement besoin, comment fonctionne le tramage par diffusion d'erreur, le seul changement qui permet aux deux de partager un carré, les deux réglages qui décident du résultat, et les trois façons dont il échoue.
Commencez par ce dont un code QR a réellement besoin
Un code QR est une grille de modules — de petits carrés soit sombres, soit clairs. Certains sont structurels et ne peuvent pas bouger : les trois grands carrés dans les coins qui permettent à un scanner de trouver et d'orienter le code, la fine ligne alternée entre eux, les petits carrés d'alignement, et les bandes qui encodent le format et la version. Tout le reste est constitué de données plus d'octets de correction d'erreurs. Cette correction d'erreurs est l'ouverture. Au niveau le plus élevé, environ 30% du code peut être détruit et un lecteur récupérera encore la charge utile. Un code n'a donc pas à être parfait. Il doit être parfait là où ça compte, et suffisamment proche partout ailleurs. Retenez cette distinction, car toute la technique repose dessus : les modules structurels sont traités comme intouchables, et la zone de données est traitée comme quelque chose qui n'a besoin d'être juste qu'en moyenne, à l'échelle où un appareil photo la voit. Tout générateur qui place une image dans un code dépense une partie de ce budget de 30% ; la seule question est le soin avec lequel il le dépense, et si l'œil peut voir le coût.
Le tramage, en un paragraphe
Le tramage de Floyd–Steinberg transforme une photographie en niveaux de gris en noir et blanc purs. Vous parcourez les pixels dans l'ordre. Pour chacun, vous choisissez le plus proche entre noir et blanc, puis vous prenez l'erreur que vous venez de commettre — la différence entre le gris voulu et la valeur posée — et vous la poussez vers les voisins pas encore visités, pondérée 7/16 vers le pixel de droite et 3/16, 5/16 et 1/16 vers les trois pixels du dessous. Chacun de ces voisins part alors d'une valeur légèrement ajustée quand vient son tour, de sorte que l'erreur n'est jamais perdue, seulement déplacée. L'image ressort comme un champ de moucheté dont la densité locale correspond à la luminosité d'origine : une région gris moyen devient à peu près moitié de points noirs, une haute lumière devient des points épars sur blanc, une ombre devient des points blancs épars sur noir. Vue de loin, l'œil moyenne le moucheté pour retrouver le ton, et c'est pourquoi une image tramée se lit comme une photographie bien que chaque pixel ne soit que de l'une de deux couleurs. Ce moyennage est exactement ce que fait un appareil photo quand il regarde une petite impression, et c'est ce que la technique exploite.
L'astuce
Rendez le code à un nombre fixe de pixels par module — SWAPQR en utilise neuf, donc chaque module est un bloc de 9×9. Puis tramez la photographie sur tout le carré, avec un changement : là où le code exige une valeur précise, ne seuillez pas. Forcez le pixel à ce dont le code a besoin, mesurez l'erreur que ce forçage a causée et diffusez-la exactement comme n'importe quelle autre erreur. Cette dernière clause est toute l'idée. Les points forcés ne sont pas peints par-dessus l'image ; ils sont payés par les pixels autour d'eux, qui se décalent pour compenser. Ils atterrissent dans la même texture poivre et sel que tout le reste, si bien que l'œil n'a rien pour les en distinguer. Les modules structurels — motifs de repérage, synchronisation, alignement, format — sont dessinés pleins et intacts, parce qu'un scanner doit trouver le code avant que la correction d'erreurs puisse l'aider. La technique décrite ici suit l'approche publiée par Andrew T., qui a documenté la génération de QR tramés en 2026 ; l'implémentation de SWAPQR a été écrite à partir de la description plutôt que portée depuis son code source.
Deux réglages qui décident de tout
Le premier est la part de chaque module qui est forcée. Forcez seulement le pixel central et l'image est presque intacte, mais le code est fragile : un pixel par module doit survivre à chaque étape de rééchantillonnage entre l'imprimante et le capteur de l'appareil photo. Forcez un bloc de 7×7 sur les 9×9 et le code est robuste et l'image pâle, parce que l'essentiel de chaque module est désormais plein. SWAPQR expose cela directement sous forme d'une balance Photo ↔ Code, avec les positions Photo, Middle et Code, pour que le compromis soit un choix que vous faites plutôt qu'une constante cachée dans le générateur. Le second est l'ampleur du décalage de chaque module. Avant le tramage, chaque pixel d'un module sombre est légèrement assombri et chaque pixel d'un module clair légèrement éclairci. L'image garde son détail, mais le ton moyen du module penche du bon côté — ce qu'un appareil photo voit quand il regarde un petit code imprimé depuis l'autre bout d'une pièce. À eux deux, ces réglages décident si le résultat est une photographie avec un code pâle dedans ou un code avec une photographie pâle dedans, et l'endroit de cette ligne où une impression donnée doit se situer dépend de la façon dont elle sera scannée.
Où ça casse, et si ça en vaut la peine
Trois modes de défaillance, tous réels, aucun mystérieux. Une photographie plate : une image éclairée uniformément, d'un seul ton, se trame en un damier régulier, qui est exactement la texture qui concurrence le code ; les images ont donc besoin d'une vraie étendue du clair au sombre, et le studio avertit quand une image n'en a pas. Un lien long : plus de caractères signifie plus de modules dans le même carré, donc chaque module reçoit moins d'image ; au-delà de la version 8 environ — 49×49 modules — la photographie n'a plus d'endroit où vivre, et un court lien de redirection est la solution. Et le gros plan extrême sur certains lecteurs, assez contre-intuitif pour avoir son propre article dans ce guide. Un code artistique est toujours un compromis au détriment de la fiabilité. Il mérite sa place là où le code fait partie du design et où quelqu'un va le scanner délibérément — une affiche, une pochette de disque, un emballage, une carte de visite. Il n'a pas sa place sur un panneau de sortie de secours. Quel que soit le contexte, testez la pièce imprimée avec un vrai téléphone avant d'en commander mille ; le studio dit la même chose à côté du bouton d'export, et il le pense.
| Partie du code | Traitement dans un code tramé | Pourquoi |
|---|---|---|
| Motifs de repérage (trois carrés de coin) | Dessinés pleins, jamais tramés | Le scanner doit localiser et orienter le code avant toute chose |
| Ligne de synchronisation, carrés d'alignement, bandes de format et de version | Dessinés pleins, jamais tramés | Structurels ; la correction d'erreurs ne peut pas réparer un code qui n'est pas trouvé |
| Modules de données et de correction d'erreurs | Un bloc central de chaque module forcé, le reste porte la photo | Le ton moyen du module est ce qu'un appareil photo voit à distance de scan |
| Pixels autour d'un bloc forcé | Décalés par diffusion d'erreur pour compenser | Garde la moyenne locale juste pour que les points forcés se cachent dans le moucheté |
| Zone de silence | Claire, intacte | Les scanners utilisent la marge vide pour trouver le bord du code |
Questions fréquentes
La photo est-elle simplement placée derrière le code ?
Non. Le code et la photo sont produits en une seule passe : l'image est tramée, et là où le code a besoin d'une valeur, le pixel est forcé et son erreur diffusée vers les voisins. Il y a une seule image, pas une couche par-dessus une autre.
Pourquoi neuf pixels par module ?
Cela donne à chaque module un bloc de 9×9, assez grand pour contenir un cœur forcé de taille variable tout en laissant des pixels pour l'image. Le réglage de balance décide de la part de ce bloc qui est forcée.
Est-ce que ça se scanne avec des téléphones ordinaires ?
Oui, pour les charges utiles et les images pour lesquelles c'est conçu, et chaque build est vérifié avec deux décodeurs indépendants à sept distances de caméra simulées. Cela reste un compromis au détriment de la fiabilité, alors imprimez-en un et testez-le avec votre propre téléphone.
Pourquoi un lien long ruine-t-il l'image ?
Un texte plus long signifie une version supérieure, donc des modules plus nombreux et plus petits dans le même carré. Chaque module a moins de place pour les pixels de la photo, et au-delà d'environ 49×49 modules l'image disparaît. Utilisez un court lien de redirection.
Imprimez le carré une fois. Décidez plus tard où il mène. SWAPQR crée des codes QR statiques gratuitement, avec toutes les options de style, sans compte et sans filigrane. Un forfait payant rend un code dynamique : le carré imprimé reste le même pendant que vous changez sa destination, et vous voyez combien de fois il a été scanné, par jour et par appareil.
Créer un code QR dans le navigateur