我目前正在一个网站上工作,最近一直在使用GD和PHP自动创建透明图像,其中包含用于网站导航,标题等的文本。它在Photoshop中节省了我很多时间,我可以在需要时立即更改按钮上的文字。
我在这里已经走到了尽头。我找到了将“文本框”(作为我的图像创建)的大小调整为文本大小的方法。但我面临的问题是我使用的TTF字体与GD期望的尺寸不同。基本上,最后一个字母将被输出图像切掉。所以我想知道是否有办法解决这个问题,同时保持文本的紧密边缘或使原始文本框的尺寸更大,然后“修剪”图像上的透明像素。
这是我现在正在使用的代码......
<?
$text = strip_tags($_GET['btn']);
if(file_exists('nav_'.$text.'.png')) {
header("Content-type: image/png");
$image = imagecreatefrompng('nav_'.$text.'.png');
imagesavealpha($image, true);
imagealphablending($image, false);
imagepng($image);
imagedestroy($image);
} else {
header("Content-type: image/png");
$fontSize = 10;
$angle = 0;
$font = "RonniaBold.ttf";
$size = imagettfbbox($fontSize, $angle, $font, $text);
$image = imagecreatetruecolor(abs($size[2]) + abs($size[0]) + 5, abs($size[7]) + abs($size[1]) + 5);
imagesavealpha($image, true);
imagealphablending($image, false);
$transparentColor = imagecolorallocatealpha($image, 200, 200, 200, 127);
imagefill($image, 0, 0, $transparentColor);
$textColor = imagecolorallocate($image, 125, 184, 222);
imagettftext($image, $fontSize, 0, 1, abs($size[5])+1, $textColor, $font, str_replace('_',' ',strtoupper($text)));
imagepng($image, 'nav_'.$text.'.png', 0);
imagedestroy($image);
}
?>
希望你们对此有一些了解,我真的可以使用它!
答案 0 :(得分:2)
尽可能使用Imagick class,因为我更喜欢ImageMagick库。以下示例几乎逐字地从给定here的示例中获取。它根据提供的文本大小创建一个图像:
$text = 'Hello World!';
// Create a new ImageMagick objects.
$im = new Imagick();
$draw = new ImagickDraw();
$colour = new ImagickPixel('#000000');
$background = new ImagickPixel('none');
// Set font properties.
$draw->setFont('Fertigo_PRO.otf');
$draw->setFontSize(72);
$draw->setFillColor($colour);
$draw->setStrokeAntialias(true);
$draw->setTextAntialias(true);
// Get font metrics.
$fm = $im->queryFontMetrics($draw, $text);
// Create text.
$draw->annotation(0, $fm['ascender'], $text);
// Create a new empty canvas, using the text size.
$im->newImage($fm['textWidth'], $fm['textHeight'], $background);
// Create the image.
$im->setImageFormat('png');
$im->drawImage($draw);
// Save the image.
$im->writeImage('test.png');
如果您想了解有关Imagick课程的更多信息,建议您使用Imagick articles中出色的Mikko's Blog。
答案 1 :(得分:2)
您的代码存在问题,导致您无法确定文本的正确大小 - 在使用imagettfbox询问文本框的大小时,您使用的是$ text:
$size = imagettfbbox($fontSize, $angle, $font, $text);
但是当您将文本写入图像时,您使用strtoupper($ text) - 这会使您的文本更大(除非您使用的是等宽字体)。