ImageMagick最适合矩形内的文字?

Roc*_*uts 4 text imagemagick dynamic centering best-fit

我有这样的图像,在特定坐标处有一个矩形:

图片

(为了便于说明,我把矩形的坐标及其大小和中心放在那里)

现在我想用ImageMagick渲染一些文本,以便它完全适合矩形.

如果它是一个非常短(窄)的字符串,矩形的高度将是限制因素:

短串

另一方面,使用长(宽)字符串,矩形的宽度将决定大小:

长串

在任何一种情况下,无论文本有多短或多长,我都希望将它打印在一行(即没有自动换行或多行),并使其完全适合矩形,并确保它居中(中心)文本位于矩形的中心).

我的问题:

  1. 如何使用ImageMagick执行此"最佳拟合"功能(我不知道如何动态确定此需要-pointsize)

  2. 如何使文本居中,当我使用-gravity center它时似乎适用于整个图像中文本的位置,即文本坐标相对于整个图像的中心.但我想指定精确(绝对)坐标,它应该是文本的中心.

例如,如果我这样做:

convert test.jpg -font Arial -fill yellow \
 -pointsize 65 -draw "text 398,90 'Hello'" test2.jpg
Run Code Online (Sandbox Code Playgroud)

我越来越:

错误

注意我指定的坐标(矩形的中心)如何成为文本的左下锚点!(这让我感到惊讶)

如果我这样做:

convert test.jpg -font Arial -fill yellow \
 -pointsize 65 -gravity center -draw "text 148,-94 'Hello'" test3.jpg
Run Code Online (Sandbox Code Playgroud)

我明白了:

OK-ISH

这有点好,但请注意我必须使用的奇怪的文本坐标.此外,我不知道如何自动计算分数(通过试验和错误做了以上).

Mar*_*ell 8

更新的答案

根据我现在收集的内容,我认为这可能是您最好的选择.

convert sea.jpg \( -size 173x50 -background none label:"A" -trim -gravity center -extent 173x50 \) -gravity northwest -geometry +312+66 -composite result.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

还有这个:

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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

基本上,我在括号中使用了一些"旁边处理"来生成文本,然后将其合成到页面上.我生成具有label:最佳自动大小的文本,然后修剪文本周围的任何多余空间.然后我中心修剪文本,使用-gravity center和扩大的背景后(使用-extent),从而使文本框始终是相同的大小,那么我可以定位它(与-geometry合成它相对于我重置左上角时)-gravityNorthWest.

原始答案

如果您希望ImageMagick尽力使您的文本适合给定的框,您应该使用caption而不是annotate,label-draw "text".

因此,您需要加载海图,设置标题的大小,绘制标题并使用-geometry以下方法将其合成到正确位置的图像上:

convert sea.jpg -size 173x50! caption:"Your text" -geometry +312+66 -composite result.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

或者,文字较长:

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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


如果您想要一个空白背景,请使用-background none之前caption:

convert sea.jpg -size 173x50! -background none caption:"Your text" -geometry +312+66 -composite result.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


如果你想让你的文字居中,你可以用PANGO这样做,但我相信你会放弃自动调整大小的功能:

convert sea.jpg -size 173x50! -background none -gravity center pango:'<span foreground="yellow">ABC</span>' -gravity northwest -geometry +312+66 -composite result.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 非常好 - 很高兴为您提供帮助!顺便说一句,我会将 `173x50` 放在一个 shell 变量中,因为我讨厌看到命令中重复的数字 - 使维护成为噩梦。祝你的项目好运,记住,问题(和答案)是免费的,所以如果你再次陷入困境,请回来问问另一个:-) (2认同)