【问题标题】:GD: Making white background for PNG transparentGD:使PNG的白色背景透明
【发布时间】:2012-05-07 18:18:24
【问题描述】:

我有一个透明背景的 PNG 水印图像。但它会随机生成白色背景而不是保持透明。

// Watermark
$watermark = imagecreatefrompng($docRoot . '/images/misc/watermark.png');
list($mwidth, $mheight) = getimagesize($docRoot . '/images/misc/watermark.png');

// Combinde watermark image with image already generated in $dst
imagecopy($dst, $watermark, $tnWidth-$mwidth-5, $tnHeight-$mheight-5, 0, 0, $mwidth, $mheight);

解决方法是添加:

imagealphablending($dst, true);
imagesavealpha($dst, true);

完整代码:

// Watermark
$watermark = imagecreatefrompng($docRoot . '/images/misc/watermark.png');
list($mwidth, $mheight) = getimagesize($docRoot . '/images/misc/watermark.png');

imagealphablending($dst, true);
imagesavealpha($dst, true);

// Combinde watermark image with image already generated in $dst
imagecopy($dst, $watermark, $tnWidth-$mwidth-5, $tnHeight-$mheight-5, 0, 0, $mwidth,

【问题讨论】:

    标签: php gd


    【解决方案1】:

    使用 Alpha 通道保存 $dst,而不是 $watermark

    // Watermark
    $watermark = imagecreatefrompng($docRoot . '/images/misc/watermark.png');
    list($mwidth, $mheight) = getimagesize($docRoot . '/images/misc/watermark.png');
    
    imagealphablending($dst, false);
    imagesavealpha($dst, true);
    
    // Combinde watermark image with image already generated in $dst
    imagecopy($dst, $watermark, $tnWidth-$mwidth-5, $tnHeight-$mheight-5, 0, 0, $mwidth, $mheight);
    

    【讨论】:

    • 只需添加 imagealphablending($dst, true);图像保存阿尔法($dst,真);成功了。谢谢你让我走上正轨。
    【解决方案2】:

    我遇到了同样的问题,但为了让它正常工作,我从我的代码中注释掉了这两行:

    imagesavealpha($image_1, true);
    imagesavealpha($image_2, true);
    

    所以我的代码看起来像这样:

    $image_1 = imagecreatefrompng("example26_".$acct.".png");
    $image_2 = imagecreatefrompng('example27.png');
    imagealphablending($image_1, true);
    imagealphablending($image_2, true);
    //imagesavealpha($image_1, true);
    //imagesavealpha($image_2, true);
    imagecopy($image_1, $image_2, 0, 0, 0, 0, 1350, 250);
    header("Content-Type: image/png");
    imagepng($image_1);
    

    现在这两个图像合并并保留了透明度,这两条线生成了一个随机的白色背景,希望这可以帮助其他有同样问题的人

    【讨论】:

      【解决方案3】:

      尝试使用 imagecopymerge 代替 imagecopy

      编辑:试试这个代码:

      header('Content-type: image/jpeg');
      $dst = imagecreatefromjpeg($image_path);
      $watermark = imagecreatefrompng($docRoot . '/images/misc/watermark.png');
      list($mwidth, $mheight) = getimagesize($docRoot . '/images/misc/watermark.png');
      imagecopymerge($dst, $watermark, $tnWidth-$mwidth-5, $tnHeight-$mheight-5, 0, 0, $mwidth, $mheight, 100);
      imagejpeg($dst,'',90);
      imagedestroy($dst);
      

      【讨论】:

        猜你喜欢
        • 2015-04-20
        • 2015-06-22
        • 2014-08-21
        • 2013-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-21
        • 2021-07-02
        相关资源
        最近更新 更多