0

我正在使用 GD 库创建图像,所有功能都运行良好。但是我坚持的主要问题是我想将png图像合并到另一个图像上,但是在重叠之后它不能正确合并并且看起来像jpg或其他而不是png。由于声誉低,我无法在此处上传我的图片,因此请单击下面的这些链接查看图片。

我要合并的图像是这个

PNG图像

png图片

我合并上面图像的图像是:

合并

我的代码在这里:

<?php
$im = imagecreate(288,288);
$background_color = imagecolorallocate($im, 230, 248, 248);
$file = 'images/smiley/smile'.$_POST['smiley'].'.png'; 
$bg = imagecreatefrompng($file);
imagealphablending($im, true); 
imagesavealpha($bg, true);
imagecopyresampled($im, $bg, 80, 80, 0, 0, 50, 50, 185, 185);

                           header("Content-Type: image/png");
            $filename = $_SESSION['rand'].'.png';
            imagepng($im,$filename);
            echo '<img src="'.$filename.'" alt="" />';
?>
4

1 回答 1

1

您的背景图像没有 Alpha 通道。这使得 PHP GD 库在不使用 alpha 通道的情况下完成所有的复制操作,而只是将每个像素设置为完全不透明或透明,这不是您想要的。

最简单的解决方案是创建一个与具有 Alpha 通道的背景大小相同的新图像,然后将背景和面部复制到该图像中。

$baseImage = imagecreatefrompng("../../var/tmp/background.png");
$topImage = imagecreatefrompng("../../var/tmp/face.png");

// Get image dimensions
$baseWidth  = imagesx($baseImage);
$baseHeight = imagesy($baseImage);
$topWidth   = imagesx($topImage);
$topHeight  = imagesy($topImage);

//Create a new image
$imageOut = imagecreatetruecolor($baseWidth, $baseHeight);
//Make the new image definitely have an alpha channel
$backgroundColor = imagecolorallocatealpha($imageOut, 0, 0, 0, 127);
imagefill($imageOut, 0, 0, $backgroundColor);

imagecopy($imageOut, $baseImage, 0, 0, 0, 0, $baseWidth, $baseHeight); //have to play with these
imagecopy($imageOut, $topImage, 0, 0, 0, 0, $topWidth, $topHeight); //have to play with these

//header('Content-Type: image/png');
imagePng($imageOut, "../../var/tmp/output.png");

该代码生成此图像: 在此处输入图像描述

于 2013-06-09T13:22:06.740 回答