Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
Sujet: QR Code Mer 1 Sep 2021 - 20:33
Dans le calme ambiant (c'est les vacances !) Je ne connais pas grand chose aux QR codes, d'autres ici sont plus qualifiés que moi, et ce qui suit est plutôt intuitif.
Je constate par expérience que les QR codes représentent un codage sous forme de bits 0 et 1, chaque bit étant représenté par un carré noir si = 1, ou blanc si = 0, que le nombre de bits verticaux est égal au nombre de bits horizontaux, d'où une image résultante carrée, et que ce nombre de bits est très variable suivant le QR code. Par exemple pour le QRcode du pass sanitaire, pour moi il fait 81x81 bits, pour mon épouse 85x85 bits...
Quant au décodage d'un QR code, c'est le mystère. J'ai récupéré sur internet un logiciel de lecture: 'Code Two QR Code Desktop Reader', le résultat est une chaîne de caractère incompréhensible, il doit y avoir plusieurs méthodes de codage. PS: Le texte d'un QR code généré par la fonction DLL de Klaus: 'GenerateQRCode' est bien restitué par le logiciel ci-dessus, j'en déduis que certains QR codes sont cryptés (par exemple celui du pass sanitaire).
Juste par curiosité, ci-dessous une petite sub qui traite un fichier QR code (bmp) récupéré par exemple par copier/coller depuis le pdf d'attestation de vaccination. L'image enregistrée se présente entourée d'un encadrement blanc. La sub supprime cet encadrement, et compte le nombre de bits d'infos du QR code (vertical = horizontal), et enregistre l'image résultante (sans bordures) dans une image bmp. On peut en paramètre dimensionner cette image à volonté).
En paramètres: fq$ = image d'origine (issue du copier/coller), jpg ou bmp fr$ = image bmp résultat w1,h1 = redimensionnement de l'image finale, si w1 > 0 On récupère au retour la valeur nb% (définie avant l'appel) = nombre de bits d'infos horizontalement et verticalement.
Code:
SUB QRCode_Dim(fq$,fr$,w1,h1) ' Suppression de l'entourage blanc autour d'un QR Code fq$ ' Résultat dans fr$ (bmp) ' Dimensions résultat w x h, nb de bits d'info nb% (largeur et hauteur) ' (***** variables w, h, nb% définis dans l'appelant *****) ' Si paramètre w1 <> 0: redimensionnement de l'image en w1 x h1 pixels. DIM_LOCAL fm$,n2,p,wi,hi,x,y,x1,y1,y2,wb,cx,cy fm$ = "Z:\Provy.bmp": ' fichier provisoire de manoeuvre, à ajuster n2 = NUMBER_2D_TARGET p = 900: PICTURE p: HIDE p: 2D_TARGET_IS p IMAGE p+1 FILE_LOAD p,fq$: FILE_SAVE p,fm$ FILEBIN_OPEN_READ 1,fm$ FILEBIN_POSITION 1,18: wi = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_POSITION 1,22: hi = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_CLOSE 1: FILE_DELETE fm$ x1 = -1 FOR y = 0 TO hi-1 FOR x = 0 TO wi-1 IF COLOR_PIXEL_BLUE(p,x,y)<128 THEN x1 = x: EXIT_FOR NEXT x IF x1 > 0 THEN EXIT_FOR NEXT y x1 = x: y1 = y FOR y2 = hi-1 TO 0 STEP -1 IF COLOR_PIXEL_BLUE(p,x1,y2)<128 THEN EXIT_FOR NEXT y2 h = y2-y1+1: w = h 2D_IMAGE_COPY p+1,x1,y1,x1+w,y1+h FILE_SAVE p+1,fr$ FOR x = x1 TO w IF COLOR_PIXEL_BLUE(p,x,y1)>128 THEN EXIT_FOR NEXT x wb = (x-x1)/7: nb% = w/wb 2D_TARGET_IS n2: DELETE p: DELETE p+1 IF w1 > 0 SCENE2D p: HIDE p: WIDTH p,w1: HEIGHT p,h1: COLOR p,0,0,0 SPRITE p: SPRITE_FILE_LOAD p,fr$ cx = w1/w: cy = h1/h: SPRITE_SCALE p,cx,cy SNAPSHOT p,fr$ DELETE p w = w1: h = h1 END_IF END_SUB
J'ai aussi une sub qui lit le fichier QR code et traduit les informations sous forme de 0 et 1 dans un fichier texte, une ligne par rangée de bits, pour analyse éventuelle ultérieure (que je ne sais pas faire...). On peut facilement reconstituer l'image QR code à partir de ce fichier texte.
Dernière édition par JL35 le Mer 1 Sep 2021 - 22:17, édité 1 fois
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
Sujet: Re: QR Code Mer 1 Sep 2021 - 21:07
Tant qu'à faire, la sub qui convertir l'image QR code (épurée comme ci-dessus, c'est à dire sans marges) en fichier texte de données 0 et 1 représentant chaque bit d'information du QR code. Quant à leur signification, c'est une autre paire de manches !
Code:
SUB QRCode_Tra(f$,nb,ft$) ' Traduction de l'image QR Code f$, de nb x nb bits d'info, sans marges, ' en un fichier texte ft$ de lignes de 0 et 1, nb lignes de nb valeurs 0/1 DIM_LOCAL n2,fm$,p,wi,hi,cx,cy,w,h,x,y,i,j,a$,v$ fm$ = "Z:\ImgQR.bmp": ' fichier provisoire de manoeuvre, à ajuster FILEBIN_OPEN_READ 1,f$: ' dimensions de l'image donnée FILEBIN_POSITION 1,18: wi = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_POSITION 1,22: hi = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_CLOSE 1 w = nb*10: h = w: ' image résultat =10 pixels par bit d'info ' 1) dimensionnement éventuel de l'image à 10 pixels par bit de données IF wi <> w p=900: SCENE2D p: HIDE p: WIDTH p,w: HEIGHT p,h: COLOR p,0,0,0 SPRITE p: SPRITE_FILE_LOAD p,f$ cx = w/wi: cy = h/hi: SPRITE_SCALE p,cx,cy SNAPSHOT p,fm$ DELETE p: f$ = fm$ END_IF ' 2) analyse de l'image résultante (1 bit = 10x10 pixels, =1 si noir, sinon 0) p=900: PICTURE p: HIDE p: WIDTH p,w: HEIGHT p,h: FILE_LOAD p,f$ n2 = NUMBER_2D_TARGET: 2D_TARGET_IS p FILE_OPEN_WRITE 1,ft$ FOR j = 0 TO nb-1 y = j*10+5: a$ = "" FOR i = 0 TO nb-1 x = i*10+5: v$ = "0" IF COLOR_PIXEL_RED(p,x,y)<128 THEN v$ = "1" a$ = a$+v$ NEXT i FILE_WRITELN 1,a$ NEXT j FILE_CLOSE 1 2D_TARGET_IS n2: DELETE p IF FILE_EXISTS(fm$) = 1 THEN FILE_DELETE fm$ END_SUB
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
Sujet: Re: QR Code Jeu 2 Sep 2021 - 14:09
Bonjour Minibug,
je connaissais ce fil de discussion (j'y suis même intervenu), je voulais simplement pouvoir décoder un QR Code, c'est simple sous forme de bits 0 et 1, mais pour la signification du contenu c'est autre chose ! Je pense qu'en général ce contenu doit être codé et qu'il faut une clé pour le décoder, ça paraît normal.
Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
Sujet: Re: QR Code Jeu 2 Sep 2021 - 14:35
JL35 a écrit:
je connaissais ce fil de discussion (j'y suis même intervenu)
Ah oui pardon, je n'avais pas regardé toutes les interventions.
Je pense surtout que le décodage ne se pratique pas d'une seule traite avec une lecture de haut en bas et de gauche a droite. Mais plutôt par zones. Comme il était indiqué dans un des liens...
Ces zones étant certainement traitées de façon indépendantes.
C'est ce qui explique qu'un simple décodage 'linéaire' ne donne pas le résultat escompté. C'est effectivement plus complexe qu'un simple code barre !
Yannick aime ce message
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
Sujet: Re: QR Code Jeu 2 Sep 2021 - 16:22
Tu as raison, ça doit pouvoir se décoder assez facilement pour une génération en clair (comme la dll de klaus), mais dans pas mal de cas les données doivent être cryptées, ce qui semble normal pour la sécurité, et dans ce cas il faut avoir les outils adéquats. Bon, j'en reste là, je voulais simplement décomposer en une liste les bits élémentaires de l'image, et pouvoir recomposer l'image à partir de cette liste, ça c'est assez facile. Quant à la signification du contenu, c'est autre chose ! Bonne journée à toi Minibug ! et profitons du beau soleil actuel !
Yannick aime ce message
Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
Sujet: Re: QR Code Sam 4 Sep 2021 - 16:58
Bonjour à tous !
Sans entrer de trop dans les détails, un QR-code est décliné sous :
- Différents modes d’encodage ; - Quarante versions ; - Quatre niveaux de correction ; - Huit masques.
1) Différents modes d’encodage. Il sera choisi afin de réduire au maximum la taille de l’information à encoder et par voie de conséquence, la taille finale du QR-code.
- Le mode numérique : uniquement pour les chiffres décimaux de 0 à 10. - Le mode alphanumérique : chiffres décimaux de 0 à 10, les lettres majuscules de A à Z et quelques symboles : « + - / * : . $ % » + l'espace. - Le mode octet : tous caractères de la table ASCII de 0 à 255. - Le mode Kanji : les caractères sont codés sur 2 octets.
Dans un QR-code, différents modes d’encodage peuvent cohabiter. Chaque trame possède un entête indiquant le mode de codage utilisé ainsi que le nombre de caractères du message.
2) Quarante versions. Elles déterminent la taille physique du QR-code. Elles sont échelonnées, en x et en y, par un pas de 4 cellules. La version à utiliser dépend de la taille de l’information qui composera le QR-code.
- La version 1 correspond à un QR-code de 17 x 17 cellules - La version 2 , 25 x 25 cellules - … - La version 40 : 177 x 177 cellules.
3) Quatre niveaux de correction. Lors de la création d’un QR-code, on choisit le niveau de correction que l’on souhaite. Il permet de corriger les erreurs dues à la lecture d’un QR-code altéré (rayé, abimé). - Niveau L (Low) : permet de récupérer jusqu’à 7% de données ; - Niveau M (Medium) : 15 % de données ; - Niveau Q (Quality) : 25 % de données ; - Niveau H (High) : 30 % de données.
4) Huit masques. Lors de la finalisation du QR-code, avant de le dessiner, on va appliquer obligatoirement un des huit masques disponibles qui inversera la couleur de certaines cellules, afin de réduire au maximum les risques d’erreurs de lecture (artéfacts).
Voilà pour un rapide survol du QR-code. Je ne suis pas entré dans la partie complexe de l’encodage des données avec la génération des octets de correction d’erreur (Reed-Solomon), ni dans l'entrelacement des données dans certaines versions.
Pour lire un QR-code, il va falloir lire et décoder les zones réservées de l’image qui permettent de connaître le numéro du masque utilisé et le niveau de correction d’erreur. Dans un QR-code de version 7 ou supérieure, une autre zone est à lire pour connaître le version exacte entre 7 et 40.
Une fois le numéro de masque employé connu, il faut démasquer les données (redonner aux cellules leur bonne couleur) puis les lire et les décoder pour obtenir le texte en clair.
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
Sujet: Re: QR Code Sam 4 Sep 2021 - 17:41
Bonjour Marc,
Et un grand merci à toi pour ces précisions, ça au moins c'est de l'info précise. Et ça me confirme bien qu'on ne peut pas décoder un QR code si on n'a pas les outils, et surtout les renseignements nécessaires correspondant au type de codage. Comme ici il avait été proposé des outils pour fabriquer un QR code, je m'étais dit que ayant plus souvent l'occasion en tant qu'utilisateur lambda de lire un QR code que d'en fabriquer un ça serait intéressant de le décoder, mais je vois bien que c'est quasiment impossible, avec toutes ces possibilités de codage.
En tout cas merci à toi, ça m'a éclairé sur bien des aspects.
Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
Sujet: Re: QR Code Sam 4 Sep 2021 - 17:51
Bonjour Marc !
Merci pour ces précisions.
Effectivement c'est complexe... et bien plus que ce que je pensais !