鉴于调用 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()
文档中看到过多次解决此问题的尝试,但它们都只是建议在这里或那里减去一两个像素,这对我来说似乎是一个 hack。这里发生了什么,为什么我们需要捏造数字才能使事情正确?
最佳答案
我认为没有完美的方法可以根据 imagettfbbox()
返回的内容以及使用 .ttf 非等宽字体在图像上放置单像素精度的文本。在 PHP 手册中,许多用户已经发布了完成此操作的方法(有或没有捏造数字);我建议使用 jodybrabec's simple function在 PHP 手册上,它计算了精确的边界框。我已经测试过这个,只有在极端情况下,文本才会在一个方向上最多偏离 1 个像素。尽管如此,如果您向图像添加一些填充(即使它只是 2 或 3 个像素),您的文本将在 100% 的时间内位于图像的尺寸内。
关于php - 从边界框确定文本坐标 a 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11671513/