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

FtD*_*Xw6 9 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));
Run Code Online (Sandbox Code Playgroud)

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

imagefilledrectangle($image, 0, 0, $boxWidth - 1, $boxHeight - 1, $color);
Run Code Online (Sandbox Code Playgroud)

之后,我画了文字:

imagettftext($image, $size, $angle, $boxBaseX, $boxBaseY, $color, $font, $text);
Run Code Online (Sandbox Code Playgroud)

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

daz*_*per 7

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

  • 这不回答我的问题.我已经在我的问题中引用了php.net注释中的变通方法,这个答案只是简单地指出了一个相同的解决方法.我不接受GD库无法确定正确的边界框,因为没有这个怪癖,大量的其他库能够做同样的事情.有一个本机解决方案(可能包括我误解了这些函数是如何工作的),或者在PHP实现中出现了问题. (3认同)