在一行中使用 imagemagick 中的两种不同字体

Use two different fonts in imagemagick on one line

所以我想在我的图像上绘制文本让我们在这个例子中说 "Trevor, 24"

但是我想为 Trevor 使用 Helvetica 字体,对于 24 我想使用 Arial 字体。但我希望它在同一条线上并且看起来像一个。

是否可能或者我将如何着手制作它,以便即使我更改姓名和年龄,我也可以像这样打印出来?

"Trevor, (Helvetica) 24(Ariel)"

我假设将它们并排打印,但如果有人输入的名字比 Trevor 24 长,我会忽略它。

想法是让它在同一条线上

大家怎么看?

$draw = new ImagickDraw();
$color = new ImagickPixel('#5b5b5b');
$bgcolor = new ImagickPixel('none');
$font = 'Helvetica';
//$draw->setFont($font);
//$draw->setFontSize(39);
$draw->setFillColor($color);
$draw->setStrokeAntialias(true);
$draw->setTextAntialias(true);

$draw->setFont($font);
$draw->setFontSize(39);

$text = 'Trevor, 24';

$draw->setGravity(Imagick::GRAVITY_WEST);
$image->annotateImage($draw, 50, 241, 0, $text);

您可以考虑将 Pango 与 ImageMagick 结合使用。我知道它在命令行下有效,但从未尝试过 PHP 绑定...

convert \
     pango:'<span font="Times 48" foreground="white" background="blue">Trevor</span><span font="Arial 32" foreground="yellow" background="black">24</span>' \
     pango.png

这很容易,但您需要做一些工作。使用 Imagick::queryFontMetrics 跟踪每个字体的绘图宽度,并简单地偏移到 X 坐标以确保对齐统一。

// Let's create a generator to simplify context management (YMMV)
function context_generator() {
    $text = array('Trevor (Helventica)',' 24 (Impact)');
    $font = array('Helvetica', 'Impact');
    foreach($text as $k => $v ) yield [$font[$k], $v];
}
$image = new Imagick();
$image->newImage(450, 100, "steelblue", "png");
$draw = new ImagickDraw();
$draw->setFillColor('black');
$draw->setStrokeAntialias(true);
$draw->setTextAntialias(true);
$draw->setFontSize(24);
$x = $y = 40;
foreach(context_generator() as $attr) {
    // Set context typeface
    $draw->setFont($attr[0]);
    // Calculate how big this type face will be (and any validation to protect overflow)
    $metrics = $image->queryFontMetrics($draw, $attr[1], FALSE);
    // Draw part
    $image->annotateImage($draw, $x, $y, 0, $attr[1]);
    // Offset origin X
    $x += $metrics['textWidth'];
}

当然上面的例子可以简化和减少