如何通过imagettfbbox获得准确的位置?

时间:2016-01-20 13:32:23

标签: php

我想创建一个具有给定文本精确尺寸的图像,并将该文本放在该图像上。我从imagettfbbox获得的位置值似乎并不准确,特别是对于斜体字体样式。这会导致某些角色在右侧被剪切。

这是我的代码:

<?php

Header("Content-type: image/png");

$font = 'fonts/ArialItalic.ttf';
$text = "SOB";
$size = 48;

$bounds = imagettfbbox($size, 0, $font, $text);

$width = abs($bounds[4]-$bounds[6]);
$height = abs($bounds[7]-$bounds[1]);

$offset_y = $height;
$offset_x = $bounds[0];

$image = imagecreate($width,$height);

$background = ImageColorAllocate($image, 0, 0, 0);
$foreground = ImageColorAllocate($image, 255, 255, 255);

ImageTTFText($image, $size, 0, $offset_x, $offset_y, -$foreground, $font, $text);

imagePNG($image);
imagedestroy($image);

?>

我从中得到的是Cutted edges

我想要的是:Text fitting inside the image

计算出的宽度和高度似乎是正确的;但是,X / Y位置($ offset_x和$ offset_y)不是。

如何动态设置$ offset_x和$ offset_y,以便文本完全适合不同字体,大小和样式的图像?

2 个答案:

答案 0 :(得分:0)

回答我自己的问题。 这是一个长期的PHP错误。见https://bugs.php.net/bug.php?id=52756 并且仍然存在于PHP 7.0.1中

可以在此处找到该错误的测试脚本:http://stuff.mindplay.dk/temp/metrics/test.php

为了让我的东西工作,我使用了一个关于php.net评论的想法 http://php.net/manual/de/function.imagettfbbox.php#97357

这个想法是将文本绘制到一个更大的画布上,并在每个像素上进行迭代,以找到每一侧(顶部,右侧,底部,左侧)的确切位置。这很慢,特别是在较大的图像上,但它适用于我。

如果有人有另一个更快或更优雅的想法,我很有兴趣阅读它。

答案 1 :(得分:0)

这是github上的library,可帮助您准确填写文本

示例代码

$text_measure = new TextMeasure($text, $font_path, $size);
$measure = $text_measure->measureText();

使用如下的度量数组:

$gd_image = imagecreatetruecolor($measure['width'], $measure['height']);
imagettftext($gd_image, $size, 0, $measure['x'], $measure['y'], $red, $font_path, $text);

预览: enter image description here