使用PHP合并图像时的图像透明度和alpha

时间:2012-10-22 08:23:06

标签: php image image-processing gd mask

所以我在PHP Doc上找到了一些代码,并稍微编辑它以合并我拥有的两个图像。然后将图像保存在服务器上的文件夹中。然而,有一个小问题,我无法弄清楚它为什么会发生。

首先是我的代码:

 $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. 框架周围的区域是白色的,多余的图案
  5. 我希望当我将框架重叠到图案上时,由于这些部件会产生一个窗框,内部有玻璃图案,白色会隐藏剩余的图案。

    为了说明我提供了图像。会发生什么。

    模式:

    pattern

    框:

    frame

    结果:

    result

    正如你所看到的,它并没有达到我的预期。谁能告诉我哪里出错了?我想将框架叠加到图案上,保持透明中心并使用多余的白色覆盖其余的图案。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:5)

请注意,你的框架有白边,如果你希望窗户是wite,你需要裁剪它并删除下面添加的imagecolortransparent如果没有你可以使用这个< / p>

$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);

输出

enter image description here


你也可以

$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);

输出

enter image description here

答案 1 :(得分:0)

如您所述,您的图片并不透明,如果我理解您所描述的内容,请尝试使用此图片。 enter image description here

你也应该找到一个程序,在保存时不会将透明度转换为白色(或检查有关此选项的选项),如果你真的让它们在第一时间变得透明。