Как генерировать QR-коды с субтитрами?

Использованиеsed:

sed '/^.\{3,10\}$/!d'

или:

sed -r '/^.{3,10}$/!d'
0
18.06.2021, 14:54
3 ответа

Imagemagics convertспешит на помощь:

  1. генерировать QR-код сqrencode(выходным PNG, SVG не работает с преобразованием, я думаю)
  2. генерировать png-изображение из строки сconvert
  3. добавить изображения с помощью 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 и обычные подозреваемые тоже хорошо различимы.

0
28.07.2021, 11:24

Создайте изображение с текстом и добавьте его к изображению:

#!/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"
0
28.07.2021, 11:24

Если вы хотите сохранить формат 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"центрирует текст по этой координате.

0
28.07.2021, 11:24

Теги

Похожие вопросы