Aller au contenu
← 1001 Widgets
N° 024 · ●●○

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.

JS
Ce qu'on apprend
  • Transformer un texte en octets avec TextEncoder
  • Dessiner une matrice sur un canvas
  • Exporter une image en PNG et en SVG
Pourquoi ce langage

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.

Comment ça marche
  1. 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>
  2. 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);
  3. 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);
    }
  4. 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');
  5. 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èges

PIÈGE 1 : Oublier la zone blanche

Piège

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.

Fix

Correct : garder une marge blanche d'au moins quatre modules tout autour.

PIÈGE 2 : Lisser les pixels

Piège

Mauvais : agrandir le canvas en CSS sans précaution. Le navigateur floute les bords des modules.

Fix

Correct : image-rendering: pixelated, des modules d'un nombre entier de pixels, ou l'export SVG.

PIÈGE 3 : Inverser les couleurs

Piège

Mauvais : un QR code clair sur fond sombre pour coller à la charte. Certains lecteurs ne le reconnaissent pas.

Fix

Correct : des modules foncés sur fond clair, avec un contraste fort.

PERSONNALISER
  • 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.
OPTIMISATION
  • 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.
VERS REACT

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.

Commentaires
0/1000

Chargement des commentaires…