Générateur de QR code
Un lien devient un QR code, dessiné pixel par pixel sans aucune bibliothèque, prêt à télécharger. Le bon exercice pour découvrir ce qu'il y a vraiment dans ces petits carrés.
- Transformer un texte en octets avec TextEncoder
- Dessiner une matrice sur un canvas
- Exporter une image en PNG et en SVG
Pourquoi un générateur de QR code ? Pour une affiche, un menu ou une carte de visite, on a souvent besoin d'un QR code. Les sites gratuits ajoutent des redirections et des publicités. Le sien ne dépend de personne.
Un QR code, c'est un texte transformé en bits, complété par des codes de correction d'erreurs, puis rangé en zigzag dans une grille avec trois carrés repères. Un masque mélange le tout pour que le téléphone le lise facilement.
Pourquoi en JavaScript simple ? La démo embarque un petit encodeur complet, mode octet et correction M. Le tuto se concentre sur ce qu'on en fait : dessiner et exporter.
LE HTML
<input id="lien" value="https://tanuki-corporation.com"> <canvas id="qr" width="240" height="240"></canvas> <a id="png" download="qr-code.png">Télécharger</a>
ENCODER
L'encodeur renvoie la taille de la grille et une fonction qui dit si un module est noir. Dans un projet, prenez une bibliothèque éprouvée comme qrcode-generator.
const q = QR.encoder(document.getElementById('lien').value);DESSINER
Une marge de 4 modules blancs autour est obligatoire pour que la lecture marche.
function dessiner(q) { const marge = 4, n = q.taille + marge * 2, px = Math.floor(240 / n); const cv = document.getElementById('qr'), ctx = cv.getContext('2d'); cv.width = cv.height = n * px; ctx.fillStyle = '#fff'; ctx.fillRect(0, 0, cv.width, cv.height); ctx.fillStyle = '#000'; for (let y = 0; y < q.taille; y++) for (let x = 0; x < q.taille; x++) if (q.module(x, y)) ctx.fillRect((x + marge) * px, (y + marge) * px, px, px); }TÉLÉCHARGER EN PNG
toDataURL transforme le canvas en image, l'attribut download fait le reste.
document.getElementById('png').href = document.getElementById('qr').toDataURL('image/png');EXPORTER EN SVG
Un chemin par module noir : le fichier reste net à n'importe quelle taille d'impression.
function svg(q) { let d = ''; for (let y = 0; y < q.taille; y++) for (let x = 0; x < q.taille; x++) if (q.module(x, y)) d += `M${x + 4},${y + 4}h1v1h-1z`; const n = q.taille + 8; return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${n} ${n}"><rect width="100%" height="100%" fill="#fff"/><path d="${d}"/></svg>`; }
PIÈGE 1 : Oublier la zone blanche
Mauvais : coller le QR code au bord de l'image ou sur un fond chargé. Beaucoup de téléphones n'arrivent plus à le lire.
Correct : garder une marge blanche d'au moins quatre modules tout autour.
PIÈGE 2 : Lisser les pixels
Mauvais : agrandir le canvas en CSS sans précaution. Le navigateur floute les bords des modules.
Correct : image-rendering: pixelated, des modules d'un nombre entier de pixels, ou l'export SVG.
PIÈGE 3 : Inverser les couleurs
Mauvais : un QR code clair sur fond sombre pour coller à la charte. Certains lecteurs ne le reconnaissent pas.
Correct : des modules foncés sur fond clair, avec un contraste fort.
- Choisissez le niveau de correction : H supporte un petit logo au centre, au prix d'une grille plus grande.
- Des modules arrondis en dessinant des cercles plutôt que des carrés, en gardant les trois repères carrés.
- Un QR code Wi-Fi : le texte WIFI:T:WPA;S:nom;P:motdepasse;; connecte un téléphone d'un geste.
- Pour l'impression, exportez en SVG : un fichier léger qui reste net en affiche A3.
- Testez toujours le code imprimé avec deux téléphones différents avant de lancer le tirage.
Le texte va dans un useState, la matrice se calcule avec useMemo quand il change.
Le dessin sur le canvas se fait dans un useEffect, avec un useRef vers l'élément.
Le SVG peut même être rendu directement en JSX, sans canvas.
Chargement des commentaires…