从边界框确定文本坐标a的正确方法是什么?

时间:2012-07-26 14:27:12

标签: php text gd bounding-box

鉴于调用imagettfbbox()的结果,提供给imagettftext()的正确,像素完美点是什么,以至于文本不会超出其边界框?

我正在从边界框中确定基线的宽度/高度和x / y,如下所示:

$box = imagettfbbox($size, $angle, $font, $text);
$boxXCoords = array($box[0], $box[2], $box[4], $box[6]);
$boxYCoords = array($box[1], $box[3], $box[5], $box[7]);
$boxWidth = max($boxXCoords) - min($boxXCoords);
$boxHeight = max($boxYCoords) - min($boxYCoords);
$boxBaseX = abs(min($boxXCoords));
$boxBaseY = abs(min($boxYCoords));

然后我在边界框尺寸的图像上绘制一个填充的矩形:

imagefilledrectangle($image, 0, 0, $boxWidth - 1, $boxHeight - 1, $color);

之后,我画了文字:

imagettftext($image, $size, $angle, $boxBaseX, $boxBaseY, $color, $font, $text);

然而,这会导致文本延伸超出矩形一两个像素。我已经看过几次尝试在PHP的imagettfbbox()文档中解决这个问题,但他们都建议在这里和那里减去一两个像素,这对我来说似乎是一个黑客攻击。这里发生了什么,为什么我们需要捏造数字以使事情正确?

4 个答案:

答案 0 :(得分:7)

我认为没有完美的方法可以根据imagettfbbox()返回的内容以及使用.ttf非等宽字体在图像上放置单像素精度的文本。在PHP手册中,许多用户已经发布了实现此目的的方法(有和没有捏造数字);我建议在PHP手册中使用jodybrabec's simple function,它会计算精确的边界框。我测试了这个,只有在极端情况下,文本在一个方向上最多放置1个像素。尽管如此,如果您为图像添加一些填充(即使它只有2或3像素),您的文本将在100%的时间内处于图像的尺寸范围内。

答案 1 :(得分:0)

当您不从此行中的每个维度中减去一个时会发生什么:

imagefilledrectangle($image, 0, 0, $boxWidth - 1, $boxHeight - 1, $color);

而是这样做:

imagefilledrectangle($image, 0, 0, $boxWidth, $boxHeight, $color);

答案 2 :(得分:0)

SlightlyMagic HQ Card Generator项目为策略卡游戏Magic:the Gathering呈现卡片。该生成器由PHP提供,内置高级文本呈现引擎。我不知道计算背后的逻辑,但渲染器对于此应用程序而言是准确的。这是计算正确边界框({​​{1}})的函数:

HQ Card Generator 8.x/scripts/classes/font.php

答案 3 :(得分:-1)

我知道这有点晚了但是imagettfbbox的分数不是像素。

pixel font size in imagettftext instead of point size