在php中从ttf字体获取单个字符的宽度?

10

我正在使用PHP的GD库创建动态图像,在我的页面上创建标题。问题是,我需要一个换行系统。这本身不是问题,但首先我需要获取当前字符的宽度(以像素为单位)。

我很好奇这个问题,是否有任何方法?还是我需要手动指定每个字母的宽度?

Martti Laine

2个回答

13
你需要对每个单独的字符运行imagettfbbox()
未经测试但应该有效:
$string = "Lorem Ipsum";
$size = 20;
$angle = 0;
$fontfile = "ARIAL.TTF";

$strlen = strlen($string);
for ($i = 0; $i < $strlen; $i++)
 {
    $dimensions = imagettfbbox($size, $angle, $fontfile, $string[$i]);
    echo "Width of ".$string[$i]." is ".$dimensions[2]."<br>";

 }

@Martti 不用谢。如果你需要的话,也可以考虑使用ImageMagick:http://www.imagemagick.org/Usage/text/#caption 它可以直接进行文字换行,并且处理TTF字体更好,但需要在服务器上安装和访问。 - Pekka
好的,我也会检查一下。 - Martti Laine
你的for循环中实际上有一个小错误,<= 应该改成 < :) - Dany Khalife
你需要考虑字符串的 0 索引。strlen($string) - 1 - brenjt

0
如果您打印出以下结果:
$string = "Lorem Ipsum";
$size = 20;
$angle = 0;
$fontfile = "./fonts/arial.ttf";

$dimensions = imagettfbbox($size, $angle, $fontfile, $string); 
print_r($dimensions);

你可能会得到类似这样的东西:

Array
(
    [0] => -1
    [1] => 5
    [2] => 152
    [3] => 5
    [4] => 152
    [5] => -20
    [6] => -1
    [7] => -20
)

每个索引都是:

0   lower left corner, X position
1   lower left corner, Y position
2   lower right corner, X position
3   lower right corner, Y position
4   upper right corner, X position
5   upper right corner, Y position
6   upper left corner, X position
7   upper left corner, Y position

因此,宽度应该是索引2-索引0。我不太明白为什么索引0要减1。

有点奇怪的是,如果你将字符串中每个字符的总和相加,结果是130而不是153。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接