我正在从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:不幸的是,当使用不同的字体大小和字体文件时,我的尺寸会不正确......
答案 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 函数的返回值中计算出它的实际界限。