ImageMagick:如何在图像上绘制两个不同大小的字符串?

3

我希望在一个矩形中绘制两个字符串。第一个字符串是15pt大小(是一个数字),第二个字符串是10pt大小(标签)。很容易将单个字符串以一个大小绘制到矩形中,我是这样做的:

$image = new Imagick('someimage.png');
$draw = new ImagickDraw;
$draw->setGravity(Imagick::GRAVITY_CENTER);
$draw->setfont(__DIR__ . DS . 'TREBUCBD.TTF');
$draw->setfontsize(15);
$draw->annotation(0, 0, '50 points');
$image->drawImage($draw);

这里的想法是让“50”在“50 points”中变大。
我尝试使用$draw->push()将当前设置推入堆栈,然后再次设置字体大小和注释,但两个字符串重叠。我已经尝试了几个小时,如果有帮助则非常感激!
上述实现是用PHP编写的,但可能我会通过使用命令行ImageMagick示例来完成它。
编辑:我已开始发起一项悬赏,将授予用PHP实现的解决方案。

你觉得http://www.php.net/manual/en/function.imagick-annotateimage.php怎么样?看起来这正是你想要的。页面上还有一个完整的示例。 - DrColossos
DrColossos,它可以产生相同的结果 - 它会生成具有给定字体和大小的文本字符串,但我希望其中一部分比其余部分更大,并且同时将这两个部分居中,就像它们是一个整体一样。 - ddinchev
2个回答

4
您可以使用+append选项将两个不同的文本标签水平连接在一起(-append - 垂直):
convert -background grey -pointsize 15 -fill black label:abc \
        -pointsize 10 -fill red label:cdefgh -gravity South +append test.png

这段代码实际上会生成两张大小恰好适合字体的图片(因为没有明确指定大小),然后这两张图片会水平拼接在一起: enter image description here 再次强调:这个图片的大小是自动计算出来的以适应您的标签。您可以使用 Imagick::labelImage 和 Imagick::appendImages 函数来实现此功能。(要制作没有背景的图像,您可以指定 -backround transparent,例如通过 Imagick::setBackgroundColor)。
之后,带有标签的结果图像可以与您想要的任何东西组合。

这很好,但我找不到使用PHP ImageMagick包装器的方法。 - ddinchev
Imagick::appendImages?http://www.php.net/manual/zh/function.imagick-appendimages.php - moropus
不,它将不同的图像附加在一起,但我想告诉它<<在大小为100x50的矩形中居中绘制字符串“51分”,“51”字体大小为15pt,“分”字体大小为11px>>。如果我绘制并附加两个不同的图像,我必须自己进行计算,因为它可能看起来对于“51分”是可以的,但如果是“10051分”,中心会移动。 - ddinchev
那我不明白你想要什么。"中心会移动"是什么意思?好的,你有一个图像,由两个不同点大小的字符串构成,然后你将其居中放置在100x50的矩形中。很明显,对于长度不同的字符串("51 points"和"100500 points"),它们居中后的x坐标将不同。这不就是你要求的行为吗? - moropus
我可能无法完全理解您的意思,但是使用追加图像,我无法构建一个包含两个不同字符串的100x50大小的图像。我必须构建两个不同的图像并将它们粘合在一起,而且我必须自己计算每个图像的大小。我应该告诉包含字符串大整数部分(105150)的图像为NNxNN像素,小部分(点)为NNxNN像素,这样不对吗?我明天会进行更多实验并确认! - ddinchev
使用 Imagick 对象,经过多次尝试后似乎无法创建图像、注释文本,然后将它们连接在一起。 :( - ddinchev

2
在“points”之前和“50”之后添加足够的空格以使它们对齐:
<?php
$image = new Imagick('test.png');
$draw = new ImagickDraw;
$draw->setGravity(Imagick::GRAVITY_CENTER);
$draw->setfontsize(30);
$draw->annotation(0, 0, '50         ');
$image->drawImage($draw);

$draw = new ImagickDraw;
$draw->setGravity(Imagick::GRAVITY_CENTER);
$draw->setfontsize(15);
$draw->annotation(0, 0, '      points');
$image->drawImage($draw);

file_put_contents('test.png', $image->getImageBlob());
?>

这是一个解决方案,基本上我让它们重叠并写下它们。但同时我必须再次“计算”需要多少空格。 - ddinchev

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