使用PHP合并两个PNG图像。输出图像CHANGES和错误的不透明度

时间:2017-07-06 16:16:35

标签: php image gd

我需要合并以下图片,但我的解决方案无效。

我的代码如下(我通过GET参数将图像的URL传递给脚本)

<?php
$dest = imagecreatefrompng($_GET['img1']);
$src = imagecreatefrompng($_GET['img2']);

imagecopymerge($dest, $src, 0, 0, 0, 0, 1500, 1500, 50);

$white = imagecolorallocate($dest, 255, 255, 255);
imagecolortransparent($dest, $white);

header('Content-Type: image/png');
imagepng($dest);
?>

两张图片均为PNG,背景透明,均为1500x1500。

第一张图片:

enter image description here

第二张图片:

enter image description here

我得到了什么: enter image description here

为什么我不能让最终图像具有正确的不透明度?我尝试将imagecopymerge()的最后一个值更改为0或100但在这些情况下我只获得一个或另一个图像。我需要它们两个,彼此完全重叠!

另外,如果仔细观察最终图像中的宝石,会有一些额外的蓝色......这怎么可能?

enter image description here

1 个答案:

答案 0 :(得分:0)

这是因为通过调用imagecolortransparent将结果图像设置为使用图像透明度而非每像素Alpha通道透明度,这会将任何白色(#ffffff)像素设置为100%透明。

结果图像上的人工制品(“额外的蓝色”和边缘像素)是由未保存的原始图像的alpha通道透明度和显示其原始图像的像素(100%透明但不是白色)引起的颜色。

结果的“褪色”外观来自告诉imagecopymerge将两张图片合并为50%的透明度。

解决方案是使用正确的alpha设置:

<?php

$dest = imagecreatefrompng($_GET['img1']);
$src = imagecreatefrompng($_GET['img2']);

imagesavealpha($dest, true);

imagecopy($dest, $src, 0, 0, 0, 0, 1500, 1500);

header('Content-Type: image/png');
imagepng($dest);