使用PHP合并图像时的图像透明度和Alpha问题

4

我在PHP文档中找到了一些代码,稍微编辑后将两张图片合并。然后将图像保存在服务器上的一个文件夹中。但是出现了一个小问题,我无法弄清楚为什么会发生。

首先是我的代码:

 $glassurl = $_GET['GlassImg'];
    $frameurl = $_GET['FrameImg'];
    $filename = (int)date("H:i:s");

    $src = imagecreatefromgif($frameurl);
    $dest = imagecreatefromjpeg($glassurl);

    imagecolortransparent($src, imagecolorat($src, 0, 0));

    imagealphablending($dest, false);
    imagesavealpha($dest, true);
    imagealphablending($src, false);
    imagesavealpha($src, true);

    $src_x = imagesx($src);
    $src_y = imagesy($src);
    imagecopymerge($dest, $src, 0, 0, 0, 0, $src_x, $src_y, 100);

    // Output and free from memory
    imagepng($dest, 'uploads/imagetest.png');
    imagegif($dest);

    imagedestroy($dest);
    imagedestroy($src

);

其次是有关图像的一些信息:
  1. 两个图像的大小完全相同
  2. 'pattern'图像只是一个块状颜色/图案
  3. 框架图像在框架内具有透明部分(允许图案显示出来)
  4. 框架周围的区域为白色,以隐藏多余的图案
我希望当我将框架叠加到图案上时,由于这些部分,它会产生一个窗框,里面有玻璃图案,而白色会隐藏剩余的图案。
为了说明,我提供了图片和结果。
图案: pattern 框架: frame 结果: result 如您所见,它并不符合我的预期。请问有人能告诉我哪里出了问题吗?我想将框架叠加到图案上,保留透明中心,并使用多余的白色覆盖其余的图案。非常感谢任何帮助。
2个回答

5
请注意,您的边框有白色边缘,如果您仍希望窗口为白色,则需要裁剪它并删除下面添加的imagecolortransparent,否则您可以使用此选项。
$imgl = "thumb/pattern.png";
$img2 = "thumb/frame.png";

$dest = imagecreatefrompng($imgl);
$src = imagecreatefrompng($img2);
imagecolortransparent($src, imagecolorat($src, 0, 0));

$src_x = imagesx($src);
$src_y = imagesy($src);
imagecopymerge($dest, $src, 0, 0, 0, 0, $src_x, $src_y, 100);

// Output and free from memory
header('Content-Type: image/png');
imagegif($dest);

imagedestroy($dest);
imagedestroy($src);

输出

输入图像描述


你也可以有

$imgl = "thumb/pattern.png";
$img2 = "thumb/frame.png";

$dest = imagecreatefrompng($imgl);
$src = imagecreatefrompng($img2);

$src_x = imagesx($src);
$src_y = imagesy($src);

$srcNew = imagecreatetruecolor($src_x, $src_y);
ImageColorTransparent($srcNew, imageColorAllocate($srcNew, 0, 0, 0));
imagecopy($srcNew, $src, 70, 50, 78, 60, 473, 293);
imagecopymerge($dest, $srcNew, 0, 0, 0, 0, $src_x, $src_y, 100);

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

imagedestroy($dest);
imagedestroy($src);

输出

这是图片描述


再次感谢您的帮助,但是,我可能有点愚蠢,这里到底改变了什么?我看不见。 - Bohdi
我的一张图片是gif格式,另一张是jpeg格式,这会有影响吗?我已经完美地模仿了你的代码,但是无法像你那样输出一个透明的中心。这是因为当保存时,透明度被转换成白色吗? - Bohdi
我实际上将你们两个的图像都保存为png格式,但这并不重要,它应该仍然可以工作。我不仅给了你代码,而且我自己测试过了。只需按照我的代码运行,就会明白我的意思。 - Baba
太好了,这正是我需要的 (y) - Yuseferi

0

你描述的图片并不是透明的,如果我理解正确,尝试使用这个图片代替它。 enter image description here

同时,你应该寻找一个在保存时不会将透明度转换为白色的程序(或检查相关选项),如果你确实已经在一开始就设置了透明度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接