鉴于调用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()
文档中解决这个问题,但他们都建议在这里和那里减去一两个像素,这对我来说似乎是一个黑客攻击。这里发生了什么,为什么我们需要捏造数字以使事情正确?
答案 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的分数不是像素。