Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP GD从创建的PNG修剪透明像素_Php_Image_Image Processing_Transparency_Gd - Fatal编程技术网

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

PHP GD从创建的PNG修剪透明像素,php,image,image-processing,transparency,gd,Php,Image,Image Processing,Transparency,Gd,我目前正在一个网站上工作,最近一直在使用GD和PHP自动创建透明图像,其中包含用于网站导航、标题等的文本。它在Photoshop中为我节省了很多时间,而且我可以在需要时立即更改按钮上的文本 我在这里遇到了一个死胡同。我找到了将创建为我的图像的“textbox”大小调整为文本大小的方法。但我面临的问题是,我使用的TTF字体与GD预期的大小不同。基本上,最后一个字母将从输出的图像中切掉。因此,我想知道是否有一种方法可以解决这个问题,同时保持文本的紧密边缘,或者使原始文本框的大小更大,然后“修剪”图像

我目前正在一个网站上工作,最近一直在使用GD和PHP自动创建透明图像,其中包含用于网站导航、标题等的文本。它在Photoshop中为我节省了很多时间,而且我可以在需要时立即更改按钮上的文本

我在这里遇到了一个死胡同。我找到了将创建为我的图像的“textbox”大小调整为文本大小的方法。但我面临的问题是,我使用的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);
}
?>


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

只要可能,我就使用,因为我更喜欢ImageMagick库。下面的例子几乎一字不差地取自所给的例子。它根据提供的文本大小创建图像:

$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类的更多信息,我建议使用优秀的。如果可能,我会使用,因为我更喜欢ImageMagick库。下面的例子几乎一字不差地取自所给的例子。它根据提供的文本大小创建图像:

$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类的更多信息,我建议您使用优秀的from。

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

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

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

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

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

但是当你将文本写入图像时,你使用strtoupper($text)-这会使文本变大(除非你使用的是单间距字体)。

I认为Imagick做不同的事情更好,但问题是,我的主机没有在他们的服务器上安装它,而且由于与另一个插件存在某种冲突,他们无法安装它。这就是为什么我尝试用GD来做这件事。我认为Imagick做不同的事情更好,但问题是,我的主机没有在他们的服务器上安装它,他们无法安装它,因为与另一个插件存在某种冲突。这就是为什么我要用GD做这件事。