- Il est possible de suivre le processus interne qui transforme un texte en QR code grâce à une visualisation des étapes 0 à 9, et de comprendre le fonctionnement de la bibliothèque Nayuki QR Code generator
- L’entrée d’exemple
Hello, world! 123est analysée comme 17 points de code Unicode et encodée en mode Byte, puisqu’elle ne relève ni du mode Numeric, ni Alphanumeric, ni Kanji - La concaténation des bits de mode, du nombre de caractères, des données de segment et des bits de terminaison produit 19 mots de code de données, ce qui correspond à la capacité du niveau ECC L de la Version 1
- Un QR code Version 1 place 19 mots de code de données et 7 mots de code ECC Reed–Solomon dans un seul bloc, puis dispose les motifs fixes et les modules de données
- Après comparaison des pénalités des 8 masques, le Mask pattern 3, au score total le plus faible, est choisi ; le résultat final ne dépend donc pas d’un simple encodage, mais aussi d’une évaluation de qualité
Objectif de la démo et traitement de l’entrée
- Cette application web visualise étape par étape le processus par lequel une chaîne de texte est encodée en QR code
- La page décompose le processus d’encodage afin d’aider à comprendre le fonctionnement interne de la QR Code generator library
- Les champs de saisie utilisateur comprennent la chaîne de texte, le niveau de correction d’erreurs, la Version minimale imposée et le motif de masque imposé
Étape 0 : analyse des caractères Unicode
- La chaîne d’exemple est
Hello, world! 123, et le texte saisi compte 17 points de code - Chaque caractère est testé pour vérifier s’il peut être encodé en mode Numeric, Alphanumeric, Byte ou Kanji
- La possibilité d’encoder toute la chaîne selon chaque mode est la suivante
- Numeric : impossible
- Alphanumeric : impossible
- Byte : possible
- Kanji : impossible
- Le mode de segment choisi pour contenir tous les caractères est Byte
Étape 1 : création du segment de données
- Chaque caractère est converti en chaîne de bits
- En modes Numeric et Alphanumeric, les caractères consécutifs sont regroupés pour l’encodage
- En mode Byte, un caractère produit 8, 16, 24 ou 32 bits
- Dans l’exemple, la valeur hexadécimale de chaque caractère est convertie en 8 bits
H:48→01001000e:65→011001011:31→001100012:32→001100103:33→00110011
- Pour simplifier, le programme de démonstration crée toujours un seul segment
- La stratégie de découpage optimale qui réduit la longueur totale en bits est traitée séparément dans optimal text segmentation for QR codes
Étape 2 : ajustement du numéro de Version
- La longueur totale en bits nécessaire pour représenter la liste de segments dépend de la plage de Versions
- Versions 1 à 9 : 148 bits, 19 mots de code
- Versions 10 à 26 : 156 bits, 20 mots de code
- Versions 27 à 40 : 156 bits, 20 mots de code
- Un mot de code est défini comme 8 bits, soit 1 octet
- La capacité en mots de code de données d’un QR code dépend de la Version et du niveau de correction d’erreurs
- L’entrée d’exemple tient dans la Version 1 avec le niveau de correction d’erreurs sélectionné
- Le numéro de Version finalement choisi est 1
Étape 3 : concaténation des segments, padding et génération des mots de code
- Plusieurs chaînes de bits sont concaténées pour former le flux de bits de données
- Mode du segment 0 :
0100, 4 bits - Nombre du segment 0 :
00010001, 8 bits - Données du segment 0 : 136 bits
- Terminator :
0000, 4 bits
- Mode du segment 0 :
- Le nombre cumulé de bits est de 152 bits
- Dans l’exemple, le Bit padding et le Byte padding font tous deux 0 bit
- Les octets de mots de code de données complets sont découpés par groupes de 8 bits et affichés en hexadécimal
41 14 86 56 C6 C6 F2 C2 07 76 F7 26 C6 42 12 03 13 23 30
Étape 4 : division en blocs, ajout de l’ECC et entrelacement
- Les statistiques des blocs de l’exemple sont les suivantes
- Nombre de mots de code de données : 19
- Nombre de blocs : 1
- Mots de code de données par bloc court : 19
- Mots de code de données par bloc long : sans objet
- Mots de code ECC par bloc : 7
- Nombre de blocs courts : 1
- Nombre de blocs longs : 0
- La séquence de mots de code de données est divisée en blocs courts et longs, puis les mots de code ECC sont calculés et ajoutés à la fin de chaque bloc
- Le processus mathématique de calcul du code de correction d’erreurs Reed–Solomon est omis au motif qu’il est long, fastidieux et peu intéressant
- La séquence finale de mots de code est composée en entrelaçant les mots de code de données et ECC
41 14 86 56 C6 C6 F2 C2 07 76 F7 26 C6 42 12 03 13 23 30 85 A9 5E 07 0A 36 C9
- Le flux de bits final à dessiner selon le scan en zigzag est également généré à partir de cette séquence de mots de code
Étapes 5 à 6 : placement des motifs fixes et des mots de code
- À l’étape des motifs fixes, un timing pattern est dessiné sur la ligne 6 et la colonne 6
- Dans les trois coins, un finder pattern 8×8 est placé, separator inclus
- Des dummy format bits temporaires sont insérés autour des finder patterns
- À l’étape du placement des mots de code, un scan en zigzag démarrant dans le coin inférieur droit est calculé
- Le scan en zigzag saute les modules fonctionnels (function modules) et parcourt les modules qui n’ont pas encore été remplis
- Les modules de données, d’ECC et de remainder sont dessinés selon les valeurs de bits des mots de code finaux et l’ordre du zigzag
- Par exemple, le mot de code hexadécimal
C5correspond au binaire11000101et produit la séquence de modules[dark, dark, light, light, light, dark, light, dark]
Étapes 7 à 9 : application des masques et calcul des pénalités
- Chaque motif de masque n’affecte que les modules non fonctionnels (non-function modules)
- Le masque est appliqué par XOR aux modules de données, d’ECC et de remainder
- Les véritables format bits sont dessinés autour des finder patterns
- La recherche de pénalités examine les éléments suivants
- Les runs horizontaux d’au moins 5 modules de même couleur
- Les runs verticaux d’au moins 5 modules de même couleur
- Les carrés 2×2 de même couleur
- Les motifs horizontaux ressemblant à un finder pattern
- Les motifs verticaux ressemblant à un finder pattern
- L’équilibre entre modules sombres et modules clairs
- La taille et le ratio de couleurs du QR code d’exemple sont les suivants
- Longueur d’un côté : 21
- Total des modules : 441
- Modules clairs : 221
- Modules sombres : 220
- Proportion de modules sombres : 49,887 %
- Écart par rapport à la moitié : −0,113 %
- Les pénalités totales des 8 masques sont les suivantes
- Mask 0 : 1204
- Mask 1 : 1134
- Mask 2 : 1084
- Mask 3 : 1081
- Mask 4 : 1121
- Mask 5 : 1100
- Mask 6 : 1189
- Mask 7 : 1137
- Le masque ayant obtenu la pénalité totale la plus faible est le Mask pattern 3
Code source
- Le code source TypeScript de l’application web est fourni sous forme de file 0 et file 1
- Le code JavaScript compilé est disponible dans creating-qr-code-steps.js
1 commentaires
Avis sur Hacker News
Ici aussi, l’auteur dit que c’est « long, fastidieux et pas très intéressant », mais comme tout le monde semble penser ainsi, c’est devenu assez difficile à trouver.
Reed-Solomon a été abordé un peu après le milieu du semestre, et l’idée centrale est que cela repose sur les polynômes. Avec suffisamment de points, un polynôme est déterminé exactement ; donc si l’on ajoute des points redondants, on peut le reconstruire même si certains disparaissent.
Le reste consiste à appliquer cela aux données binaires, c’est-à-dire à utiliser des corps finis ; c’est mathématiquement élégant, mais ça devient assez complexe.
https://www.thonky.com/qr-code-tutorial/error-correction-cod...
https://dev.to/maxart2501/let-s-develop-a-qr-code-generator-...
https://www.youtube.com/watch?v=w5ebcowAJD8
Les commentaires dégagent une forte impression d’élitisme. En parcourant rapidement le blog, on voit qu’il demande des dons en Bitcoin en suggérant 3 $, mais il ne semble pas tenir compte du fait qu’une bonne partie pourrait disparaître en frais.
Ça ressemble à : « Non, tu ne peux pas utiliser le code de mon dépôt GitHub pour ton chatbot de projet universitaire. Tes standards de codage ne sont pas à la hauteur des miens. Et ton anglais est nul. »
Heureusement, il partage aussi séparément les bons retours : https://www.nayuki.io/page/decent-feedback-from-readers
Je ne veux pas d’un truc du genre « branchez simplement cette bibliothèque de vision par ordinateur et donnez-lui l’image, elle renverra le résultat », comme on en voit sur Google.
Je cherche un guide qui parte du principe qu’on dispose déjà des données brutes de l’image décodée, puis qui implémente tous les algorithmes nécessaires.
J’en ai aussi trouvé quelques-uns sur GitHub, mais ils avaient d’autres problèmes ; j’ai donc rapidement fait le mien avec une bibliothèque bien conçue que j’avais déjà utilisée, et ça m’a pris environ 15 minutes.
https://greggman.github.io/qr-code/
On pourrait ajouter davantage d’options, mais en réalité la plupart des utilisateurs n’en ont probablement pas besoin.
Si quelqu’un connaît de bonnes ressources pour comprendre la partie correction d’erreurs liée aux QR codes, je suis preneur.
https://github.com/aabiji/qr
https://github.com/PDP-10/its/blob/master/src/lars/qrcode.8