如何使用PHP Imagick根据文件大小对齐文本?

时间:2016-09-15 20:05:43

标签: php imagick

我在特定位置X和Y的图像中放置了一些文本。我也尝试像在Photoshop上的框中那样对齐文本,但是当我使用$ draw-> setTextAlignment()时,我得到了一个不同的结果。见下文:

当前结果:

Current alignment

期望的结果:

Desired alignment

文本及其属性(字体名称,大小,颜色等)是动态的,因此大小可能会有所不同。

有人可以帮我吗?

代码:

<?php

$draw = new \ImagickDraw();
$draw->setStrokeColor(new \ImagickPixel('black'));
$draw->setFillColor(new \ImagickPixel('red'));
$draw->setStrokeWidth(1);
$draw->setFontSize(36);

// First box
$draw->setTextAlignment(\Imagick::ALIGN_LEFT);
$draw->annotation(250, 75, "First line\nSecond Line");

// Second box
$draw->setTextAlignment(\Imagick::ALIGN_CENTER);
$draw->annotation(250, 210, "First line\nSecond Line");

// Third box
$draw->setTextAlignment(\Imagick::ALIGN_RIGHT);
$draw->annotation(250, 330, "First line\nSecond Line");

$draw->line(250, 0, 250, 500);

$image = new \Imagick();
$image->newImage(500, 500, new \ImagickPixel('transparent'));
$image->setImageFormat("png");
$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();

P.S。这些示例中仅使用垂直线来显示对齐差异。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案!查看结果图片和说明:

See the text boxes properly aligned

我们可以使用$draw查询Imagick::queryFontMetrics对象,以便了解文字的宽度和高度 - 它还会返回此目的不需要的其他信息,请参阅:

Array returned by Imagick::queryFontMetrics

X坐标ImagickDraw::annotation的第一个参数,用于指定文本在水平轴上的绘制位置。

使用我们手中的文字宽度(textWidth),我们可以计算出正确的文本 X坐标,为每个文本对齐执行以下操作:

  • - 按原样使用 X坐标 - 无所事事。
  • 中心 - 将 X坐标 +文本的一半宽度相加。
  • 正确 - 将 X坐标与文本的整个宽度相加。

查看实际操作中的代码:

<?php
$image = new \Imagick();

$draw = new \ImagickDraw();
$draw->setStrokeColor(new \ImagickPixel('black'));
$draw->setFillColor(new \ImagickPixel('red'));
$draw->setStrokeWidth(1);
$draw->setFontSize(36);
$text = "First line\nSecond Line";

// First box
$draw->setTextAlignment(\Imagick::ALIGN_LEFT);
$draw->annotation(250, 75, $text);

// Second box
$draw->setTextAlignment(\Imagick::ALIGN_CENTER);
$metrics = $image->queryFontMetrics($draw, $text);
$draw->annotation(250 + ($metrics['textWidth'] / 2), 210, $text);


// Third box
$draw->setTextAlignment(\Imagick::ALIGN_RIGHT);
$metrics = $image->queryFontMetrics($draw, $text);
$draw->annotation(250 + ($metrics['textWidth']), 330, $text);

$draw->line(250, 0, 250, 500);

$image->newImage(500, 500, new \ImagickPixel('transparent'));
$image->setImageFormat("png");
$image->drawImage($draw);

header("Content-Type: image/png");
echo $image->getImageBlob();

输出正确对齐文本的图像。

有关详细信息,请参阅以下参考资料: