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

标签 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() 文档中看到过多次解决此问题的尝试,但它们都只是建议在这里或那里减去一两个像素,这对我来说似乎是一个 hack。这里发生了什么,为什么我们需要捏造数字才能使事情正确?

最佳答案

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

关于php - 从边界框确定文本坐标 a 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11671513/

相关文章:

java - 从文本文件导入到 Java 数组

python - 统计文件中所有单词的词频

linux - 用引号将文本文件中的所有行括起来 ('something' )

生成图标的PHP代码

php - Composer 没有加载我自己的 psr-0 文件

php - 相当于 mysql_num_rows 或 mssql_num_rows 的 PDO

php - 从 php 数据库中获取一组 JSON 数据

php - 选择并列出 child 和 parent

php 调整大小脚本不适用于透明 gif

php - 我如何在 ubuntu 上重新编译 php?