English version

Le QR code.



Ce code fait partie de la famille des codes à 2 dimensions, il peut encoder jusqu'à 7089 caractères sur une très petite surface. L'encodage se fait en deux étapes : tout d'abord les données sont converties en un flux de bit découpé en mots-clé. (Encodage de haut niveau) puis ceux-ci sont convertis en petits carrés noirs et blancs. (Encodage de bas niveau) De plus un système de correction des erreurs permet de reconstituer des données mal imprimées, effacées, floues ou arrachées. Dans la suite de cet exposé, l'expression "mot-clé" sera abrégée en MC et code de Reed-Solomon en RS. Il existe aussi des micro QR codes non étudiés ici.

La structure générale.

L'encodage de bas biveau.
Il existe 40 versions (Tailles) de symbole. Un ensemble de paramètres est attaché à chaque version : A partir de ces paramètres nous pouvons calculer d'autres valeurs, cela est fait à l'aide d'une feuille de calcul :
On va y trouver le calcul de la taille du symbole, du nombre et de l'emplacement des mires d'alignement, les surfaces occupées par les différents éléments, etc ...

Pour construire un QRcode il faut :

L'encodage de haut biveau.
On utilisera par la suite les opérateurs : + --> addition, x --> multiplication, \ --> division entière, MOD --> reste de la division entière
Il existe 4 modes d'encodage (Compression) qui peuvent être mixés :
Mode de compression Données à encoder Taux de compression Indicateur de mode Numérique Chiffres ASCII 3 chiffres dans 10 bits 0001 Alphanumérique Chiffres + lettres majuscules + 9 symboles 2 caractéres dans 11 bits 0010 Octet Octet 1 octet dans 8 bits 0100 Kanji Caractères asiatiques / 1000
Il existe d'autres indicateurs non étudiés ici : 0111 = ECI, 0011 = Multi codes, 0101 et 1001 = FNC1
0000 est l'indicateur de fin de données.
Chaque segment commence par un indicateur de mode de 4 bits suivi du nombre de caractères codé sur un nombre de bit variable (Voir tableau), suivi des données.
La détection et la correction des erreurs.
La création des codes barres.
Maintenant que nous savons créer le motif d'un code barre, il nous reste à le dessiner à l'écran et à l'imprimer sur papier. Deux approches sont possibles : Si nous donnons une valeur à chaque point de cette matrice de 2 X 2 comme ceci :
1 2 4 8
la valeur ASCII du caractère associé à une matrice donnée est la somme des valeurs de chaque point + 65 (65 = A = pas de point, tout blanc !)


La police " datamatrix.ttf " (Convient aux QRcodes)
Cette police contient les 16 caractères A (ASCII : 65) à P (ASCII : 80)

Copiez ce fichier dans le répertoire des polices, le plus souvent : \Windows\Fonts

Encodage d'un QRcode.

Le programme devra se dérouler en plusieurs étapes : Du fait de l'interaction entre les différents modes de compression il est difficile de faire une optimisation à 100%. La norme donne toutefois en annexe J une méthode d'optimisation ...
L'évaluation du résultat des différents masque se fera "à l'oeil" et par test des codes obtenus.

Un petit programme pour tester tout ça.

Voici un petit programme écrit en Visual Basic 6 ; le
fichier d'installation copiera le programme,
les dépendances Visual Basic, les fichiers sources et la police.

Fichier d'auto-installation :

Fichier ZIP sans installation :

La fonction QRcode$ fait environ 900 lignes, je ne la reproduis donc pas ici, il suffit de la récuperer dans le fichier "form1.frm" qui se trouve avec le programme ci-dessus ; avec le programme d'auto-installation le fichier "form1.frm" se trouve dans le répertoire du programme, sous-répertoire "sources".

La fonction s'appelle de la manière suivante : resultat$ = QRcode$(Chaine$, Level%, Mask%, Version%, CodeErr%)
Les deux derniers paramètres sont optionnels et sont passés par références. Valeurs de CodeErr% au retour de la fonction : Il suffit maintenant d'afficher ou d'imprimer la chaine resultat$ avec la police datamatrix par exemple dans un traitement de texte. Les utilisateurs d'Office pourront même intégrer la fonction QRcode$ dans une macro afin d'automatiser le traitement. Pour arriver à effectuer tous les traitements dans une unique fonction, j'ai dû utiliser des "Gosub" au lieu de fonctions avec paramètres; j'entends déjà les esthètes de la programmation hurler au sacrilège.


Vous aimez cette page ?

Elle vous est utile ?
Cliquez ici !