图像字符串 - 获取字符串长度的大小(以像素为单位)


imagestring - Get the size of the string lengh in pixels

你好,只是想提前提一下,这不是重复的。我已经看到了类似的帖子,但所有这些帖子都使用特定的字体,但事实并非如此。我使用默认字体编号 3(对于此示例),我希望能够计算输出大小并将其放在我的$canvas的确切中心

imagestring($canvas,3,imagesx($canvas),imagesy($canvas),$myString,imagecolorallocate($canvas,239,13,177));

我知道如何进行计算以将其放在中心,这很容易,唯一遗漏的参数是考虑到字体编号 3 的字符串的确切大小(以像素 (x/y) 为单位)。考虑字体编号 3 的字符串的像素 (x/y)。

更新了答案,不使用特定字体。PHP 嵌入式字体确实是等宽的(经过测试和工作):

$font           = 3;
$img            = imagecreatetruecolor(500, 500);
$text           = "Waldson Patricio";
$color          = imagecolorallocate($img, 255, 255, 255);
$size           = strlen($text);
$tw             = $size * imagefontwidth($font);
$th             = imagefontheight($font);

imagestring($img, $font, (imagesx($img) - $tw) / 2 , (imagesy($img) - $th) / 2, $text, $color);
header('Content-type:image/jpeg');
imagejpeg($img);

imagettfbbox和imagettftext将完成这项工作:

//setup
$font     = '<path to font>';
$string   = 'My String';
$fontSize = 12;
//getting width and height
$bBox   = imagettfbbox($fontSize, 0, $font, $string);
$width  = $bBox[2] - $bBox[0];
$height = $bBox[1] - $bBox[7];
//drawing in the center
imagettftext($canvas, $fontSize, 0, (imagesx($canvas) - $width)/2, (imagesy($canvas) - $height)/2, $color, $font, $string);

经过一番研究,我找不到图像字符串中使用的字体具有标准的宽度或间距。在我的 PHP 实现中,字体 3 似乎有 6 x 9 像素字符,像素间距为 1 像素,等宽,所以 7 * strlen 应该给出一个相当准确的宽度,9 应该给出字符串图像的高度(我假设你只在居中一行)。但是,这可能是特定于平台或实现的,因此,如果它不适合您,则必须衡量自己。

这个解决方案是,如果你必须使用imagestring(),当然 - 使用imagettftext()和imagettfbbox()对于准确测量会更好,正如Waldson所建议的那样。