如何生成带字幕的二维码?

如何生成带字幕的二维码?

我需要生成数千个简单 ID 的二维码(1234、1235、1236...),并希望能够使它们易于人类阅读。 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

Imagemagicsconvert来救援:

  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

<text>如果你想保留 svg 格式,编辑 xml 以在文件末尾添加新元素似乎并不困难。我不太了解 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" ...并将高度和第四个 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"文本在此坐标上居中。

相关内容