在文本中使用空格字符时,imagettfbbox()返回错误的尺寸

时间:2009-10-22 08:45:09

标签: php imagettftext

我正在从PHP动态创建一个图形菜单,它只会产生一个如下图像:

One    Two    Three    Four

问题是,我必须确定x-offset和每个页面标题的宽度(例如左边偏移和“One”的宽度,以像素为单位),以便用css定位图像。

一切正常,除了包含空格的页面标题 - imagettfbbox()返回错误的位置。我使用的是arial字体(TTF)

有关如何解决此问题的任何建议?

编辑:我现在正在使用它,使用以下函数来确定文本的边界:

function calculateTextBox($font_size, $font_angle, $font_file, $text) {
    $box = imagettfbbox($font_size, $font_angle, $font_file, $text);

    $min_x = min(array($box[0], $box[2], $box[4], $box[6]));
    $max_x = max(array($box[0], $box[2], $box[4], $box[6]));
    $min_y = min(array($box[1], $box[3], $box[5], $box[7]));
    $max_y = max(array($box[1], $box[3], $box[5], $box[7]));

    return array(
        'left' => ($min_x >= -1) ? -abs($min_x + 1) : abs($min_x + 2),
        'top' => abs($min_y),
        'width' => $max_x - $min_x,
        'height' => $max_y - $min_y,
        'box' => $box
    );
}

编辑2:不幸的是,当使用不同的字体大小和字体文件时,我的尺寸会不正确......

2 个答案:

答案 0 :(得分:0)

这样做的一种方法是使用imagecolorat函数来计算图像中特定点的像素颜色,它不会是最快的,甚至不一定是最好的方法。但它应该工作。

这样的东西(搜索黑色像素)应该有效,并且会返回你正在寻找的边界,然后你可以将其翻译成x /坐标:

function get_bounds($image)
{
    $height = imagesy($image);
    $width = imagesx($image);


    $to_return = new stdClass();
    $to_return->top = null;
    $to_return->bottom = null;
    $to_return->left = null;
    $to_return->right = null;

    for ($x = 0; $x < $width; $x++)
    {
        for ($y = 0; $y < $height; $y++)
        {
            $color = imagecolorat($image, $x, $y);
            $rgb = imagecolorsforindex($image, $color);

            // If its black
            if (($rgb['red'] == 0) && ($rgb['green'] == 0) && ($rgb['blue'] == 0))
            {
                if (($y < $to_return->top) || is_null($to_return->top))
                {
                    $to_return->top = $y;
                }

                if (($y > $to_return->bottom) || is_null($to_return->bottom))
                {
                    $to_return->bottom = $y;
                }

                if (($x < $to_return->left) || is_null($to_return->left))
                {
                    $to_return->left = $x;
                }

                if (($x > $to_return->right) || is_null($to_return->right))
                {
                    $to_return->right = $x;
                }
            }
        }
    }

    return $to_return;
}

答案 1 :(得分:0)

实际上,可以从imagettftext 函数的返回值中计算出它的实际界限。