PHP Imagick如何最适合文本注释


PHP Imagick how to best fit text annotation

我正在向newPseudoImage添加注释文本,它工作得很好,但我想使文本缩放以适合图像大小。

我该怎么做呢?

$im = new Imagick();
$draw = new ImagickDraw();
$draw->setFillColor($color);
$draw->setFont($font);
$draw->setFontSize(($width, $height) / 100) * 15);
$draw->setGravity(Imagick::GRAVITY_CENTER);
$im->newPseudoImage($width, $height, "canvas:{$bg}"); 
$im->annotateImage($draw, 0, 0, 0, $text);
$draw->clear();
$draw->destroy();
$im->setImageFormat('gif');
header("Content-Type: image/gif");
echo $im;

我想你可以使用imageftbbox函数来帮助你。

这将为您提供文本字符串的边界框,具有给定的ttf字体,大小和角度。

你可以创建一个循环来增加或减少字体大小,只要文本不适合图像。

<?php
$bbox = imageftbbox(12, 0, 'Arial.ttf', 'This is a test');
$width_of_text = $bbox[2] - $bbox[0];

您可以查看$width_of_text并调整字体大小,只要字体没有按您的喜好缩放即可。请记住,随着字体的增大,宽度和高度也会随之增大。

我也面临同样的问题,虽然我还没有尝试过,因为我离开了我的机器,我要给这个试试。

使用类的查询字体度量函数,我将能够获得文本的计算宽度,然后将其与其容器的指定宽度进行比较。我将调整字体大小并重复,直到它足够接近。你可以通过这种方式获得相当准确的结果,但如果图像中有多个文本项,则可能出现性能问题。

另一方面,如果你不太关心文本的样式,你可以使用标题。

这是一个有点幼稚的解决方案(我可以使用二进制搜索来找到合适的字体大小),但它对我来说很有效。

在我的示例中,我想将文本放置在图像中的一个框上,因此我使用imageftbbox计算适当的字体大小。

$size = $MAX_FONT_SIZE;
while (true){
    $bbox = imageftbbox($size, 0, $font, $text );
    $width_of_text = $bbox[2] - $bbox[0];
    if ($width_of_text > $MAX_TEXT_WIDTH) {
            $size -= 1;
    }
    else {
            break;
    }
}
$height_of_text =  ($bbox[3] - $bbox[1]);
$draw->setFontSize( $size );
$image->annotateImage($draw, $TEXT_WIDTH_CENTER - $width_of_text/2, $TEXT_HEIGHT_CENTER - $height_of_text/2, 0, $text);