![如何產生帶字幕的二維碼?](https://rvso.com/image/192246/%E5%A6%82%E4%BD%95%E7%94%A2%E7%94%9F%E5%B8%B6%E5%AD%97%E5%B9%95%E7%9A%84%E4%BA%8C%E7%B6%AD%E7%A2%BC%EF%BC%9F.png)
我需要產生數千個簡單 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
來救援:
- 產生 QR 碼
qrencode
(輸出 PNG,SVG 不適用於轉換,我認為) - 從字串產生 png 圖像
convert
- 附加影像與轉換
這是這個的腳本:
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"
文字在此座標上居中。