imagemagick 字体规格——如何将文本放置在网格中?

发布于 2024-11-19 17:50:42 字数 587 浏览 1 评论 0原文

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

在此处输入图像描述

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

我想知道,我是否可以调整 imagemagick 中的文本输出来实现此目的,而无需使用自己的命令放置每个字符。

一些额外的事实:

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

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

多谢!

let's have a look at the following image:

enter image description here

I have a horizontal grid and i want to place a text in this grid. The above example is wrong, because what i would like to have is that each character is placed exactly in one of the cells of the grid.

I wonder, if i can adjust the text-output in imagemagick to achieve this, without having to place each of the characters with it's own command.

Some additional facts:

  • i am using imagemagick from some shell script
  • i am doing rather complex drawings with imagemagick's MVG -- so it would be nice if the text could be still placed with the MVG commands
  • i am able to adjust the width of the grid by a few pixel, if this would be required with your solution, but all cells of course need to have the same width
  • i am always using the same fixed-width font (Courier) for this
  • i am able parse the font-metrics in my shell script and use this information to apply values to my text-commands
  • i only care about horizontal placement, vertical placement is not important because i render each row individual

With all this in mind -- is there any solution for my problem?

Thanks a lot!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夜血缘 2024-11-26 17:50:43

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

例如

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)

在此处输入图像描述

You can use the kerning option - setting inter-character spacing.

e.g.

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

will generate the following images. You must simply find the right kerning value for match the grid. (for monospaced font - like your Courier)

enter image description here

抚笙 2024-11-26 17:50:43

如果您想将非单色字体强制放入网格中,则可以使用以下脚本:

#!/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

If you have a non mono-typed font that you want to force into a grid, you can use this script:

#!/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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文