Wie kann ich QR-Codes mit Untertiteln generieren?

Wie kann ich QR-Codes mit Untertiteln generieren?

Ich muss mehrere tausend QR-Codes mit einfachen IDs (1234, 1235, 1236, ...) generieren und möchte sie auch für Menschen lesbar machen. qrencodeist ein wirklich cooles Tool zum Generieren von QR-Codes, ABER es gibt dort keine Möglichkeit, Untertitel hinzuzufügen.

Irgendwelche Ideen?

Antwort1

Erstellen Sie ein Bild mit dem Text und hängen Sie diesen an das Bild an:

#!/bin/bash

txt="$1"
qrencode -o "$txt".png "$txt"

convert  -pointsize 36 "label:$txt" "$txt.gif"
convert -append "$txt".png "$txt.gif" "$txt.total.gif"

Antwort2

Imagemagics convertzur Rettung:

  1. QR-Code generieren mit qrencode(PNG ausgeben, SVG funktioniert mit Konvertieren nicht, glaube ich)
  2. Generieren Sie ein PNG-Bild aus einem String mitconvert
  3. Bilder mit convert anhängen

Hier das Skript dazu:

for i in $(cat ../input.csv); do 
  qrencode $i -t png -l H -s 10 -o $i.q.png;
  convert -size 290x40 xc:white -pointsize 34 -gravity center -font /usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf -draw "text 0,0 '$i'" $i.s.png; 
 convert -append $i.q.png $i.s.png $i.png; rm $i.q.png; rm $i.s.png; 
 echo $i; 
done;

DejaVuSansMono.ttf hat Punkte in den Nullen, was es gut lesbar macht, es kann noch weitere geben. 1 und kleines L und die üblichen Verdächtigen sind auch gut erkennbar.

Antwort3

Wenn Sie das SVG-Format beibehalten möchten, scheint es nicht allzu schwierig zu sein, die XML zu bearbeiten, um <text>am Ende der Datei ein neues Element hinzuzufügen. Ich kenne mich mit SVG nicht gut genug aus, um dies auf eine Standardmethode zu tun, aber wenn man sich ansieht, wie die Datei aussieht, wenn man mit einem SVG-Editor eine Textzeile hinzufügt, awkkönnte das folgende Skript für das von Ihnen angegebene Beispiel ausreichen.

i=1234
qrencode "$i" -t svg -l H -s 10 -o "$i.q.svg.orig"
awk <"$i.q.svg.orig" >"$i.q.svg" -v txt="$i" '
/<svg /{ match($0,"height=\"([0-9.]+)",grp)
    ht = grp[1]*1.1
    ht = "height=\"" ht
    sub("height=\"([0-9.]+)",ht,$0)
    match($0,"viewBox=\"0 0 ([0-9]+) ([0-9]+)",grp)
    vb = int(grp[2]*1.1+.5)
    x = int(grp[1]/2+.5)
    y = grp[2]+1
    vb = "viewBox=\"0 0 " grp[1] " " vb
    sub("viewBox=\"0 0 ([0-9]+) ([0-9]+)",vb,$0)
}
/<rect x="0" /{
    match($0,"height=\"([0-9.]+)",grp)
    ht = int(grp[1]*1.1+.5)
    ht = "height=\"" ht
    sub("height=\"([0-9.]+)",ht,$0)
}
/<\/svg>/{
    printf "  <text font-family=\"Helvetica, sans-serif\" font-size=\"6\" stroke-width=\"0\" text-anchor=\"middle\" x=\"%d\" y=\"%d\" xml:space=\"preserve\">%s</text>",x,y,txt
}
{print}
'

Dies ist komplexer als wirklich nötig, um etwas allgemeiner zu sein.

Es nimmt das Original <svg width="10.23cm" height="10.23cm" viewBox="0 0 29 29" ...und skaliert die Höhe und die 4. ViewBox-Werte um 10 %, sodass es wird <svg width="10.23cm" height="11.23cm" viewBox="0 0 29 33" ....

Es nimmt dann das weiße Rechteck im Hintergrund und vergrößert die Höhe in ähnlicher Weise von <rect ... height="29"auf <rect ... height="33".

Abschließend wird <text...>vor dem Ende eine Zeile hinzugefügt, wobei als x- und y-Positionen die aus der viewBox ermittelten Werte verwendet werden. text-anchor="middle"Der Text wird auf diese Koordinate zentriert.

verwandte Informationen