2

让我们看一下下面的图片:

在此处输入图像描述

我有一个水平网格,我想在这个网格中放置一个文本。上面的例子是错误的,因为我想要的是每个字符都被准确地放置在网格的一个单元格中。

我想知道,我是否可以调整 imagemagick 中的文本输出来实现这一点,不必使用它自己的命令放置每个字符。

一些额外的事实:

  • 我正在使用一些 shell 脚本中的 imagemagick
  • 我正在用 imagemagick 的 MVG 做相当复杂的绘图——所以如果文本仍然可以用 MVG 命令放置会很好
  • 如果您的解决方案需要,我可以将网格的宽度调整几个像素,但所有单元格当然需要具有相同的宽度
  • 我总是为此使用相同的固定宽度字体(Courier)
  • 我能够解析我的 shell 脚本中的字体指标并使用此信息将值应用于我的文本命令
  • 我只关心水平放置,垂直放置并不重要,因为我渲染每一行

考虑到这一切——我的问题有什么解决方案吗?

非常感谢!

4

2 回答 2

2

您可以使用 kerning 选项 - 设置字符间距。

例如

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

将生成以下图像。您必须简单地找到匹配网格的正确字距调整值。(对于等宽字体 - 就像你的 Courier)

在此处输入图像描述

于 2012-08-01T22:14:16.513 回答
1

如果您想要强制进入网格的非单一字体,则可以使用此脚本:

#!/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
于 2013-04-26T04:54:30.737 回答