Метрики шрифта imagemagick - как разместить текст в сетке? - PullRequest
2 голосов
/ 14 июля 2011

давайте посмотрим на следующее изображение:

enter image description here

У меня есть горизонтальная сетка, и я хочу разместить текст в этой сетке. Приведенный выше пример неверен, потому что я хотел бы, чтобы каждый символ был расположен точно в одной из ячеек сетки.

Интересно, могу ли я настроить вывод текста в imagemagick для достижения этой цели, без необходимости размещать каждый из символов с помощью его собственной команды.

Некоторые дополнительные факты:

  • Я использую imagemagick из некоторого сценария оболочки
  • Я делаю довольно сложные рисунки с помощью MVG в imagemagick - поэтому было бы неплохо, если бы текст можно было разместить с помощью команд MVG
  • Я могу отрегулировать ширину сетки на несколько пикселей, если это потребуется для вашего решения, но, конечно, все ячейки должны иметь одинаковую ширину
  • Я всегда использую один и тот же шрифт фиксированной ширины (Courier) для этого
  • Я могу анализировать метрики шрифта в моем сценарии оболочки и использовать эту информацию для применения значений к моим текстовым командам
  • Меня интересует только горизонтальное размещение, вертикальное размещение не важно, потому что я отображаю каждую строку индивидуально

Имея все это в виду - есть ли решение моей проблемы?

Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 02 августа 2012

Вы можете использовать опцию кернинга - установить межсимвольный интервал.

, например

for i in 0 3 6 9 12 15
do
    convert -kerning $i -font Courier -pointsize 24  label:":Kerning $i:" label_$i.jpg
done

сгенерирует следующие изображения. Вы должны просто найти правильное значение кернинга для соответствия сетке. (для моноширинного шрифта - как у вашего курьера)

enter image description here

1 голос
/ 26 апреля 2013

Если у вас нет шрифта без монотипии, который вы хотите вставить в сетку, вы можете использовать этот скрипт:

#!/usr/bin/env bash
rm test*png

font=~/Library/Fonts/WittenbergerFrakturMTStd.otf
gridsize=32x32

chr() { 
   case "$1" in
      64 ) echo '\@' ;;
      92 ) echo '\\' ;;
      *  ) printf \\$(printf '%03o' $1)
   esac  
}  

for i in {32..127}; do
   c=$( chr $i )
   echo -n "$c: "
   convert -background transparent -density 90 -pointsize 12 -gravity center -font "$font" label:"$c" -extent $gridsize test-$i.png
done

convert test-{32..127}.png +append test.png
...