PHP GD从创建的PNG修剪透明像素

Posted

技术标签:

【中文标题】PHP GD从创建的PNG修剪透明像素【英文标题】:PHP GD Trim Transparent Pixels from created PNG 【发布时间】:2010-08-15 04:36:03 【问题描述】:

我目前正在开发一个网站,最近一直在使用 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);

?>

希望你们对此有所了解,我真的可以使用它!

【问题讨论】:

【参考方案1】:

我尽可能使用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 课程的信息,我推荐来自 Mikko's Blog 的优秀 Imagick articles。

【讨论】:

我认为 Imagick 在做不同的事情方面要好得多,但问题是我的主机没有在他们的服务器上安装它,并且由于与另一个插件的某种冲突,他们无法安装它.这就是为什么我试图用 GD 来做这件事。【参考方案2】:

您的代码有问题,导致您无法确定文本的正确大小 - 当使用 imagettfbox 询问文本框的大小时,您使用 $text:

$size = imagettfbbox($fontSize, $angle, $font, $text);

但是当您将文本写入图像时,您使用 strtoupper($text) - 这会使您的文本更大(除非您使用等宽字体)。

【讨论】:

以上是关于PHP GD从创建的PNG修剪透明像素的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GD 使用 PHP 创建透明背景?

PHP GD 库中的图像透明度

Photoshop 透明度修整

PHP中带有GD的透明背景

如何使用 Perl 和 GD 创建透明的真彩色 PNG?

Perl GD 检查像素是不是透明