我正在将注释文本添加到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;
答案 0 :(得分:8)
我认为您可以使用imageftbbox功能来帮助您。
这将为您提供文本字符串的边界框,其中包含给定的ttf字体,大小和角度。
只要文字不能正确拟合图像,您就可以创建一个增加或减少字体大小的循环。
<?php
$bbox = imageftbbox(12, 0, 'Arial.ttf', 'This is a test');
$width_of_text = $bbox[2] - $bbox[0];
只要字体不符合您的喜好,您就可以查看$width_of_text
并调整字体大小。请记住,随着字体的增加,宽度和高度都会增加。
取决于您尝试将其缩放到可能有用的内容。
答案 1 :(得分:1)
我正面临着同样的问题,虽然我还没有尝试过这个问题,因为我已经离开了我的机器,但我还是试着去做。
使用类的查询字体度量函数我将能够获得文本的计算宽度,然后将其与其容器的指定宽度进行比较。我将调整字体大小并重复直到它足够接近。您可以通过这种方式获得相当准确,但如果图像中有多个文本项,请记住可能的性能问题。
另一方面,如果您不关心文本的样式,可以使用标题。
答案 2 :(得分:-1)
这是一个稍微天真的解决方案(我本可以使用二进制搜索来找到合适的字体大小),但它对我有用。
在我的示例中,我想将文本放在图像中的一个方框上,因此我使用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);