ImageMagick 最适合矩形内的文本?
ImageMagick best fit text within rectangle?
我有一个像这样的图像,在特定坐标处有一个矩形:
(为了便于说明,我将矩形的坐标及其大小和中心放在那里)
现在我想用 ImageMagick 渲染一些文本,以便它 完全适合矩形。
如果它是一个非常短(窄)的字符串,矩形的高度将是限制因素:
另一方面,对于长(宽)字符串,矩形的 宽度 将决定大小:
在任何一种情况下,无论文本有多短或多长,我都想将其打印成一行(即没有自动换行或多行),并使其完全适合矩形,并确保它是 centered(文本的中心在矩形的中心)。
我的问题:
如何使用 ImageMagick 实现此 'best fit' 功能(我不知道如何为此动态确定所需的 -pointsize
)
如何让文字居中,当我使用-gravity center
时,它似乎适用于整个图像中文字的位置,即文本坐标相对于整个图像的中心。但我想指定精确(绝对)坐标,那应该是文本的中心。
例如,如果我这样做:
convert test.jpg -font Arial -fill yellow \
-pointsize 65 -draw "text 398,90 'Hello'" test2.jpg
我得到:
请注意我指定的坐标(矩形的中心)如何成为文本的左下角锚点! (这让我很惊讶)
如果我这样做:
convert test.jpg -font Arial -fill yellow \
-pointsize 65 -gravity center -draw "text 148,-94 'Hello'" test3.jpg
我得到:
还不错,但请注意我必须使用奇怪的文本坐标来获取它。此外,我不知道如何自动计算点数(通过反复试验完成上述操作)。
更新答案
根据我现在收集到的信息,我认为这可能是您最好的选择。
convert sea.jpg \( -size 173x50 -background none label:"A" -trim -gravity center -extent 173x50 \) -gravity northwest -geometry +312+66 -composite result.png
还有这个:
convert sea.jpg \( -size 173x50 -background none label:"A very much longer label" -trim -gravity center -extent 173x50 \) -gravity northwest -geometry +312+66 -composite result.png
基本上,我在括号中使用一些 "aside processing" 来生成文本,然后将其合成到页面上。我使用 label:
生成文本到最佳自动大小,然后 trim 关闭文本周围任何多余的 space。然后,我将 trimmed 文本居中,使用 -gravity center
并展开背景(使用 -extent
),以便文本框始终保持相同大小,然后我可以定位它(使用 -geometry
) 当我将 -gravity
重置为 NorthWest
.
时相对于 top-left 角进行合成
原答案
如果您希望 ImageMagick 尽最大努力使您的文本适合给定的框,您应该使用 caption
而不是 annotate
、label
或 -draw "text"
。
所以你想加载你的海图,设置标题的大小,绘制标题并使用 -geometry
:
在正确的位置将其合成到图像上
convert sea.jpg -size 173x50! caption:"Your text" -geometry +312+66 -composite result.png
或者,使用更长的文本:
convert sea.jpg -size 173x50! caption:"A considerably longer text that will result in a smaller font being chosen" -geometry +312+66 -composite result.png
如果您想要空白背景,请在 caption:
之前使用 -background none
convert sea.jpg -size 173x50! -background none caption:"Your text" -geometry +312+66 -composite result.png
如果你想让你的文字居中,你可以用 PANGO 来做,就像这样,但我相信你会放弃 auto-sizing 功能:
convert sea.jpg -size 173x50! -background none -gravity center pango:'<span foreground="yellow">ABC</span>' -gravity northwest -geometry +312+66 -composite result.png
我有一个像这样的图像,在特定坐标处有一个矩形:
(为了便于说明,我将矩形的坐标及其大小和中心放在那里)
现在我想用 ImageMagick 渲染一些文本,以便它 完全适合矩形。
如果它是一个非常短(窄)的字符串,矩形的高度将是限制因素:
另一方面,对于长(宽)字符串,矩形的 宽度 将决定大小:
在任何一种情况下,无论文本有多短或多长,我都想将其打印成一行(即没有自动换行或多行),并使其完全适合矩形,并确保它是 centered(文本的中心在矩形的中心)。
我的问题:
如何使用 ImageMagick 实现此 'best fit' 功能(我不知道如何为此动态确定所需的
-pointsize
)如何让文字居中,当我使用
-gravity center
时,它似乎适用于整个图像中文字的位置,即文本坐标相对于整个图像的中心。但我想指定精确(绝对)坐标,那应该是文本的中心。
例如,如果我这样做:
convert test.jpg -font Arial -fill yellow \
-pointsize 65 -draw "text 398,90 'Hello'" test2.jpg
我得到:
请注意我指定的坐标(矩形的中心)如何成为文本的左下角锚点! (这让我很惊讶)
如果我这样做:
convert test.jpg -font Arial -fill yellow \
-pointsize 65 -gravity center -draw "text 148,-94 'Hello'" test3.jpg
我得到:
还不错,但请注意我必须使用奇怪的文本坐标来获取它。此外,我不知道如何自动计算点数(通过反复试验完成上述操作)。
更新答案
根据我现在收集到的信息,我认为这可能是您最好的选择。
convert sea.jpg \( -size 173x50 -background none label:"A" -trim -gravity center -extent 173x50 \) -gravity northwest -geometry +312+66 -composite result.png
还有这个:
convert sea.jpg \( -size 173x50 -background none label:"A very much longer label" -trim -gravity center -extent 173x50 \) -gravity northwest -geometry +312+66 -composite result.png
基本上,我在括号中使用一些 "aside processing" 来生成文本,然后将其合成到页面上。我使用 label:
生成文本到最佳自动大小,然后 trim 关闭文本周围任何多余的 space。然后,我将 trimmed 文本居中,使用 -gravity center
并展开背景(使用 -extent
),以便文本框始终保持相同大小,然后我可以定位它(使用 -geometry
) 当我将 -gravity
重置为 NorthWest
.
原答案
如果您希望 ImageMagick 尽最大努力使您的文本适合给定的框,您应该使用 caption
而不是 annotate
、label
或 -draw "text"
。
所以你想加载你的海图,设置标题的大小,绘制标题并使用 -geometry
:
convert sea.jpg -size 173x50! caption:"Your text" -geometry +312+66 -composite result.png
或者,使用更长的文本:
convert sea.jpg -size 173x50! caption:"A considerably longer text that will result in a smaller font being chosen" -geometry +312+66 -composite result.png
如果您想要空白背景,请在 caption:
-background none
convert sea.jpg -size 173x50! -background none caption:"Your text" -geometry +312+66 -composite result.png
如果你想让你的文字居中,你可以用 PANGO 来做,就像这样,但我相信你会放弃 auto-sizing 功能:
convert sea.jpg -size 173x50! -background none -gravity center pango:'<span foreground="yellow">ABC</span>' -gravity northwest -geometry +312+66 -composite result.png