【问题标题】:Image transparency and alpha when merging images with PHP使用 PHP 合并图像时的图像透明度和 alpha
【发布时间】:2012-10-12 00:41:09
【问题描述】:

所以我在 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. “图案”图像只是块颜色/图案
  3. 框架图像在框架内有透明部分(以允许图案显示出来)
  4. 框架周围的区域是白色的,以消除多余的图案

我希望当我将框架覆盖到图案上时,因为这些部分,它会产生一个窗框,里面有玻璃图案,白色会隐藏剩余的图案。

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

图案:

框架:

结果:

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

【问题讨论】:

    标签: php image image-processing gd mask


    【解决方案1】:

    请注意,您的框架有白边,如果您希望窗户变白,则需要裁剪并删除下面添加的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);
    

    输出

    【讨论】:

    • 再次感谢您的帮助,但是,我可能很愚蠢,但是这里发生了什么变化?我看不到它
    • 我的一张图片是 gif 一张是 jpeg 有关系吗?完美模仿了你的代码,我无法像你一样输出透明中心。是不是因为保存的时候透明度变成了白色?
    • 我实际上将你的两个图像都保存为 png .. 但没关系.. 它应该仍然可以工作.. 不仅仅是给你代码.. 我自己测试了它...... 只是按原样运行我的代码..你会看到我在说什么
    • 太好了,这正是我所需要的(y)
    【解决方案2】:

    您的图像不像您描述的那样透明,如果我理解您的描述正确,请尝试使用它。

    如果您确实首先将透明设置为透明,那么您应该找到一个在保存(或检查有关此选项)时不会将透明转换为白色的程序。

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 2014-08-23
      • 1970-01-01
      • 2012-12-25
      • 2012-11-20
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      相关资源
      最近更新 更多