Php 如何使用imagettfbbox获得准确位置?

Php 如何使用imagettfbbox获得准确位置?,php,Php,我想创建一个具有给定文本精确尺寸的图像,并将该文本放置到该图像上。我从imagettfbbox获得的位置值似乎并不精确,特别是对于斜体字体样式。这会导致某些字符在右侧被剪切 这是我的密码: <?php Header("Content-type: image/png"); $font = 'fonts/ArialItalic.ttf'; $text = "SOB"; $size = 48; $bounds = imagettfbbox($size, 0, $font, $text);

我想创建一个具有给定文本精确尺寸的图像,并将该文本放置到该图像上。我从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);

?>

我从中得到的是

我想要的是:

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

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

回答我自己的问题。 这是一个很长时间的PHP错误。看见 并且仍然存在于PHP7.0.1中

可以在此处找到该错误的测试脚本:

为了让我的东西正常工作,我使用了一个来自php.net上的评论的想法

其思想是将文本绘制到一个更大的画布上,并在每个像素上进行绘制,以从每一侧(顶部、右侧、底部、左侧)找到精确的位置。这是相当缓慢,特别是在较大的图像,但它的作品为我

如果有人有其他更快或更优雅的想法,我很有兴趣阅读

在github上有一个帮助您精确匹配文本的

示例代码

$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);
预览:

只是为了记录在案。这个问题在最新的PHP版本(5.6.29和PHP7.1.0)中得到了修复,可能不再需要解决。