PHP imagettftext基线解决方案

PHP imagettftext基线解决方案,php,imagettftext,baseline,Php,Imagettftext,Baseline,我写的是使用PHP将文本打印到图像上。但是,函数imagettftext()使用基线,而我需要文本垂直居中 所以,我需要一种方法来打印文本,y不是从顶部到基线的距离,而是从边界框顶部到顶部的距离,或者我需要一种方法来确定边界框顶部和基线之间的距离 显然,我把你弄糊涂了。因此,我要说清楚:我知道函数imagettfbbox()。使用该函数,我可以确定结果文本框的高度和宽度。但是,当使用imagettftext()打印时,它的高度对于垂直对齐是完全无用的,因为Y参数不是到方框顶部(甚至底部)的距离,

我写的是使用PHP将文本打印到图像上。但是,函数
imagettftext()
使用基线,而我需要文本垂直居中

所以,我需要一种方法来打印文本,y不是从顶部到基线的距离,而是从边界框顶部到顶部的距离,或者我需要一种方法来确定边界框顶部和基线之间的距离

显然,我把你弄糊涂了。因此,我要说清楚:我知道函数
imagettfbbox()
。使用该函数,我可以确定结果文本框的高度和宽度。但是,当使用
imagettftext()
打印时,它的高度对于垂直对齐是完全无用的,因为Y参数不是到方框顶部(甚至底部)的距离,而是到方框内文本基线的距离

编辑:为什么我不接受最新的答案


请参阅我在答案下方的最新评论,并将其作为参考。

不完全确定您的问题……您能举个例子吗?也许这就是你需要的

// get bounding box dims
$dims = imagettfbbox($fontsize, 0, $font, $quote);

// do some math to find out the actual width and height
$width = $dims[4] - $dims[6]; // upper-right x minus upper-left x 
$height = $dims[3] - $dims[5]; // lower-right y minus upper-right y
编辑:下面是垂直居中文本的示例

<?php
$font = 'arial.ttf';
$fontsize = 100;
$imageX = 500;
$imageY = 500;

// text
$text = "FOOBAR";

// create a bounding box for the text
$dims = imagettfbbox($fontsize, 0, $font, $text);

// height of bounding box (your text)
$bbox_height = $dims[3] - $dims[5]; // lower-right y minus upper-right y

// Create image
$image = imagecreatetruecolor($imageX,$imageY);

// background color
$bgcolor = imagecolorallocate($image, 0, 0, 0);

// text color
$fontcolor = imagecolorallocate($image, 255, 255, 255);

// fill in the background with the background color
imagefilledrectangle($image, 0, 0, $imageX, $imageY, $bgcolor);

$x = 0; 
$y = (($imageY/2) - ($bbox_height/2)) + $fontsize;
imagettftext($image, $fontsize, 0, $x, $y , $fontcolor, $font, $text);

// tell the browser that the content is an image
header('Content-type: image/png');
// output image to the browser
imagepng($image);

// delete the image resource 
imagedestroy($image);
?>

我不知道答案是否仍然感兴趣。但是,imagettfbbox()函数提供的信息不仅仅是边界框的高度和宽度。它的设计完全是为了返回imagettftext()所需的信息,以便根据需要管理文本

诀窍在于,从imagettfbbox()返回的坐标与绝对左上角无关,而是与特定文本的字体基线相关。这是因为框是在点坐标中指定的,而点坐标通常是负数

简言之:

$dims = imagettfbbox($fontsize, 0, $font, $text);

$ascent = abs($dims[7]);
$descent = abs($dims[1]);
$width = abs($dims[0])+abs($dims[2]);
$height = $ascent+$descent;

...

// In the example code, for the vertical centering of the text, consider
// the simple following formula

$y = (($imageHeight/2) - ($height/2)) + $ascent;
这非常适合我的项目。 希望这有帮助

对不起英语。
马可。

你要做的是计算你想要文本的坐标。使用imagettfbbox查看文本的大小,然后从图像的高度中减去它并除以2。好吧,就是这样!Imagettfbbox()为我提供了边界框,非常好,但对于垂直对齐完全没有用处,因为imagettftext不使用到边界框顶部或底部的距离,而是使用到基线的距离,这使得对齐文本很困难,因为我不知道基线相对于文本框的位置。感谢您的提问,我也在寻找答案,但似乎没有答案。我正在生成一些ID标记,并希望名称填充可用空间。对我来说,问题是悬挂的字母(qypjg…)。带有这些字母的单词以较小的字体大小占据可用高度(使用imagettfbbox计算),但不会填充空间,因为它们悬挂在空间底部下方。这不是世界末日,但它确实让事情看起来不一致和偏离中心。不,这不是我需要的。我知道函数imagettfbbox,但它计算边界框,而imagettftext使用到基线的距离作为Y参数,而不是到框的顶部或底部。好的,我认为您在这里混淆了自己或思考过度了。如果要垂直对齐文本,则需要imagettfbbox()。要获取imagettftext()的y参数,请将图像的高度除以2。这是你的垂直中心,我们称之为$ivc。然后取imagettfbbox()计算出的高度除以2,我们称之为$tvc。然后,$y=$ivc-$tvc;此外,您还需要将fontsize添加到$y以说明这一点。编辑以添加垂直对齐文本的示例否,我尝试过一次。这是错误的,正如我创建的图形所示:我不知道该告诉你什么,也许是你正在使用的字体,或者是你正在使用的字符集。可能它有缺陷或者不完全支持,或者GD库在其他方面有问题。因为我的示例代码可以正常工作。哇,Marco,这正是我一直在寻找的。我想我已经找到了一个解决方案,在高度上增加了三分之一的字体大小(因为这似乎是基线和底部之间的差异),但是你的解决方案更精确。非常感谢。