![Как создать QR-коды с субтитрами?](https://rvso.com/image/192246/%D0%9A%D0%B0%D0%BA%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C%20QR-%D0%BA%D0%BE%D0%B4%D1%8B%20%D1%81%20%D1%81%D1%83%D0%B1%D1%82%D0%B8%D1%82%D1%80%D0%B0%D0%BC%D0%B8%3F.png)
Мне нужно сгенерировать несколько тысяч QR-кодов простых идентификаторов (1234, 1235, 1236, ...) и я хочу сделать их также удобочитаемыми для человека. qrencode
— это действительно классный инструмент для генерации QR-кодов, НО в нем нет возможности добавить подзаголовок.
Есть идеи?
решение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
спешит на помощь:
- сгенерировать QR-код с помощью
qrencode
(выходной PNG, SVG не работает с convert, я думаю) - сгенерировать изображение png из строки с помощью
convert
- добавьте изображения с помощью 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
Если вы хотите сохранить формат 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...>
строку перед концом, используя в качестве позиций x и y значения, найденные из viewBox. Центрирует text-anchor="middle"
текст по этой координате.