PHP ImageMagick定位中心对齐文本

时间:2016-10-04 14:09:16

标签: php imagemagick imagick

我正在使用PHP ImageMagick(Imagick)创建由多个图像和文本组成的图像,由我网站的访问者上传和添加。它实际上是一种画布,用户可以上传图像,定位它们,可选地添加一些文本,点击按钮后,所有图像和文本都将被捆绑到一个图像中。

一切正常,但现在我想添加另一个功能:text-align:center。我希望我的用户能够在中心添加对齐的文本。

要添加普通(左对齐)文本,请使用以下代码:

$text_temp = new ImagickDraw();
$text_temp->setGravity(Imagick::GRAVITY_NORTHWEST);
...
$image->annotateImage($text_temp, $new_left, $new_top, $angle, html_entity_decode($item->text));

$ new_left,$ new_top,$ angle在两者之间计算并且是正确的。当我左对齐文本时,这是结果: Input and output as they should be

但是,问题来了。我希望文本居中。所以我把我的代码更改为:

$text_temp = new ImagickDraw();
if($item->textalign == 'center') {
    $text_temp->setGravity(Imagick::GRAVITY_NORTHWEST);
    $text_temp->setTextAlignment(Imagick::ALIGN_CENTER);
}
...
$image->annotateImage($text_temp, $new_left, $new_top, $angle, html_entity_decode($item->text));

文本确实居中,但位置不再正确。 查看输入和输出结果:Strange positions when text is aligned in the center

我使用setGravity的原因是因为我可以从左上角定位文本。但是现在看起来它再次从中心定位,我不知道我做错了什么。

$ new_left和$ new_top变量是正数,乘以正数,因此x或y位置无法为负数。

有没有人有想法?

更新 @MarkSetchell感谢您的回复,它让我朝着正确的方向前进。我没有像你这样做,但我通过在用户文本周围添加一个包装器(span)来解决问题。我已经保存了图像的宽度和高度,因此很容易对文本做同样的事情。通过这些信息,我可以确定文本的中心,从而将其从中心定位。这适用于横向定位:

$text_temp->setTextAlignment(Imagick::ALIGN_CENTER);
$new_left = $new_left + ($new_width / 2);
//$new_top = $new_top + ($new_height / 2);
$new_top = $new_top + ($new_fontsize);

但它没有用于垂直定位。仍然不知道为什么,但我现在处理它好像我从顶部(不是中心)定位。然后添加一次文本的字体大小。我无法解释为什么这有效,但它确实有效。有人可以告诉我吗?

1 个答案:

答案 0 :(得分:0)

将高度设置为字体大小。像这样:

// Need to be defined: $conts, $col, $bg, $fs, $format, $w, $h, $dst, $font

$txt = new ImagickDraw();
$txt->setFillColor(new ImagickPixel($col));
$txt->setFontSize($fs);
$txt->setFont($font);
$txt->setTextAlignment(Imagick::ALIGN_CENTER);
$txt->annotation($w/2, $fs, $conts);  // Here

$im = new Imagick();
$im->newImage($w, $h, $bg, $format);
$im->drawImage($txt);
$im->writeImage($dst);