gpt4 book ai didi

php - 如何使用 PHP Imagick 根据文本框大小对齐文本?

转载 作者:行者123 更新时间:2023-12-02 20:58:20 25 4
gpt4 key购买 nike

我在图像中的特定位置 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();

附:这些示例中使用垂直线只是为了显示对齐差异。

最佳答案

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

See the text boxes properly aligned

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

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();

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

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

关于php - 如何使用 PHP Imagick 根据文本框大小对齐文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39519482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com