字幕付きの QR コードを生成するにはどうすればいいですか?

字幕付きの QR コードを生成するにはどうすればいいですか?

単純な ID (1234、1235、1236、...) の QR コードを数千個生成する必要があり、それらを人間が読めるようにしたいと考えています。QR qrencodeコードを生成するのに非常に優れたツールですが、そこにサブタイトルを追加する方法がありません。

何か案は?

答え1

テキストを含む画像を作成し、それを画像に追加します。

#!/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"

答え2

Imagemagics がconvert救世主です:

  1. QR コードを生成しますqrencode(出力は PNG、SVG は変換できないと思います)
  2. 文字列からpng画像を生成するconvert
  3. 変換して画像を追加する

このスクリプトは次のとおりです。

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 にはゼロの中にドットがあり、読みやすくなっています。他にもあるかもしれません。1 と小文字の L や、よく見かける文字もよく判別できます。

答え3

SVG 形式を維持したい場合、XML を編集して<text>ファイルの末尾に新しい要素を追加するのはそれほど難しくないようです。私は SVG を標準的な方法で実行できるほど詳しくありませんが、SVG エディターを使用してテキスト行を追加したときのファイルの様子を見ると、次のawkスクリプトはあなたが示した例には十分かもしれません。

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}
'

これは、もう少し汎用性を高めるために、実際に必要な範囲よりも複雑になっています。

初期値を取得し<svg width="10.23cm" height="10.23cm" viewBox="0 0 29 29" ...、高さと 4 番目の viewBox の値を 10% 拡大して、 になります<svg width="10.23cm" height="11.23cm" viewBox="0 0 29 33" ...

次に、背景の白い四角形を取得し、同様に高さを から まで拡大し<rect ... height="29"ます<rect ... height="33"

最後に、<text...>viewBox から見つかった値を x と y の位置として使用して、末尾の前に行を追加します。text-anchor="middle"テキストはこの座標の中央に配置されます。

関連情報