使用ImageMagick生成“文本”图像的正确语法

4
我将尝试使用ImageMagick生成测试图像。该图像只需要包含文本。直接使用IM网站上的示例不起作用:(IM网站上的示例)
convert -background lightblue -fill blue -font Roboto -pointsize 72 label:Anthony label.gif

产出:

convert.im6: unable to read font `Roboto' @ warning/annotate.c/RenderType/853.
convert.im6: no images defined `label.gif' @ error/convert.c/ConvertImageCommand/3044.

那么,要使用字体名称需要什么条件(我的整个桌面都使用Roboto字体,所以我认为它已经正确安装了,其他字体名称也无法使用),如果我删除字体规范,仍然会得到第二行而没有输出。

我有什么遗漏吗?

在Ubuntu 14.04上使用ImageMagick 6.7.7-10 2016-11-29 Q16


看这里... https://dev59.com/hmAf5IYBdhLWcg3wZB-u#24701602 - Mark Setchell
没有字体的问题... - xenoid
有一些迹象表明这是一个由于安全问题的回补而导致的错误。请参见https://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=30989 - rici
@rici 感谢你提醒。 - xenoid
4个回答

6
这是你所使用的ImageMagick版本中的一个错误,这是由于错误的bugfix patch回溯导致的。
有问题的patch是Debian patch 0161-Do-not-ignore-SetImageBias-bias-value。我无法确定它是否包含在2016年11月14日针对8:6.7.7.10-6ubuntu3.2的安全更新或2016年11月29日针对8:6.7.7.10-6ubuntu3.3的安全补丁中(或者至少我没有费心去弄清楚,因为这不是那么重要)。该补丁被创建为此安全补丁的回溯,但由于文件coders/label.c中逻辑的重新组织,纠正结果被插入了错误的位置。
实际上,label.c的逻辑如下:
1. 如果未指定图像的大小或点大小,则计算最佳匹配 2. 如果未指定图像的宽度,则从计算出的宽度中复制它 3. 如果未指定图像的高度,则从计算出的高度中复制它 4. 如果未指定图像的点大小,则从计算出的点大小中复制它 5. 对图像参数进行一些其他相关设置 6. 将文本渲染到图像中。
安全补丁的目的是,如果无法使用生成的图像大小,则避免步骤6。这避免了在使用ImageMagick作为Web后端时可能发生的拒绝服务攻击(这很常见)。它增加了以下内容:
3a. 如果图像尺寸不可用,请立即失败。
不幸的是,在应用补丁的版本中,上述步骤的顺序不同,第三步与第五步交织在一起。(据我所知,这没有什么实际意义,但有点杂乱无章,这可能是后来修复的原因。)结果是添加的步骤3a被插入在从计算出的高度复制图像高度之前。这会导致检查失败,如果图像最初没有高度,即使在那个时候已经计算出了正确的高度。
说明明确表明label:源不需要-size(或-pointsize)参数。但是,由于错位的patch,这证明是不正确的;除非在几何形状中指定了高度,否则不会生成标签。

我还没有为这个问题生成错误报告,因为它只适用于过时的Ubuntu版本上过时的ImageMagic版本(可能也适用于Debian)。恰好我和OP都在一些机器上使用这个过时的Ubuntu版本,并且我的建议是我们两个都应该升级。但是如果其他人也遇到了这个问题,我会回答这个问题(我发现当我尝试在自己的机器上研究相同的问题时)。


3
最终我使用了-size而不是-pointsize使其工作,并切换到caption,因为我可以更好地控制位置。
convert -background transparent -fill darkblue -font Roboto-Regular -size 200x100 -gravity center 'caption:Test' out.png

1
convert -background lightblue -fill blue -font Arial -pointsize 72 label:"Anthony" label.gif

在我的IM 6.9.7.0 Q16 Mac OSX上,以上内容运行良好。


0

除了字体错误,因为我没有安装那个字体,Windows 7版本的设置对我来说还可以。将其设置为Arial可以消除字体错误。

尝试这个方法,看看Imagemagick是否能够识别您的字体:

identify -list type

否则,我会尝试使用路径直接链接到您的字体,并在末尾放置.ttf。我假设您的字体是.ttf格式的,因为Imagemagick支持该格式和另一种我无法记住的格式。
顺便说一下,您的版本已经有4.5年了。

使用命令 identify -list font 列出字体,我可以看到应该使用'Roboto-Regular'字体。但是我仍然收到“未定义图像”的消息。 - xenoid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接