使用 imagecopymerge 添加时具有透明背景的图像变为白色

Posted

技术标签:

【中文标题】使用 imagecopymerge 添加时具有透明背景的图像变为白色【英文标题】:Image with transparanent background becoming white when added with imagecopymerge 【发布时间】:2021-06-09 21:40:10 【问题描述】:

我正在使用imagecopymerge 将图像放在另一个图像之上,但是,当我这样做时,图像的透明部分会变成白色,这不是我想要的。所以我有以下图片作为背景:

我在其上添加的具有透明背景的图像是这样的:

然而,这(连同我的其余代码)导致圆圈周围的区域和边界内为白色:

我现在用来注入值的代码是:

    $magical = imagecreatefrompng('Magical.png');
    imagecopymerge($img, $magical, 366, 135, 0, 0, 32, 32, 100);

研究表明我应该尝试使用imagealphablendingimagecopy 之类的东西,而不是imagecopymerge,但这不起作用。我还找到了尝试imagecolortransparentimagecolorallocate 的参考,但这也不起作用。因此,例如,这些尝试都没有奏效:

    $magical = imagecreatefrompng('Magical.png');
    $white = imagecolorallocate($output, 255, 255, 255);
    imagecolortransparent($magical, $white);
    imagecopymerge($img, $magical, 366, 135, 0, 0, 32, 32, 100);
// or this attempt
    $magical = imagecreatefrompng('Magical.png');
    imagealphablending($img, true);
    imagealphablending($magical, true);
    imagecopymerge($img, $magical, 366, 135, 0, 0, 32, 32, 100);

我在这里缺少什么?如何确保将图像添加到另一个图像时保留其透明度?

【问题讨论】:

这个和***.com/questions/7728508/…一样吗? imagealphablending 的结果是什么? 在官方 php 文档中,用户提交了一个可能对您有用的答案。 php.net/manual/en/function.imagecopymerge.php#92787 我看到了,@hppycoder,如上所述,imagecolortransparent 没有做任何帮助。 A,看起来是什么,identical 图像,@HassaanAli。 【参考方案1】:

我将您的图像提取到我的本地计算机并使用了 PHP 文档 - https://www.php.net/manual/en/function.imagecopymerge.php#92787 中列出的 imagecopymerge_alpha 函数

<?php

function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct)
    // creating a cut resource
    $cut = imagecreatetruecolor($src_w, $src_h);

    // copying relevant section from background to the cut resource
    imagecopy($cut, $dst_im, 0, 0, $dst_x, $dst_y, $src_w, $src_h);

    // copying relevant section from watermark to the cut resource
    imagecopy($cut, $src_im, 0, 0, $src_x, $src_y, $src_w, $src_h);

    // insert cut resource to destination image
    imagecopymerge($dst_im, $cut, $dst_x, $dst_y, 0, 0, $src_w, $src_h, $pct);


$img = imagecreatefrompng('baseImage.png');
$magical = imagecreatefrompng('overlay.png');
imagecopymerge_alpha($img, $magical, 366, 135, 0, 0, 32, 32, 100);

imagepng($img, "./test.png");

【讨论】:

以上是关于使用 imagecopymerge 添加时具有透明背景的图像变为白色的主要内容,如果未能解决你的问题,请参考以下文章

PHP - ImageCopyMerge 分层图像

php如何给图片加文字水印

java TrayIcon使用具有透明背景的图像

PHP:将透明 PNG 添加到具有不透明度的 JPEG

在具有透明背景的绘制文本上添加图案覆盖

php缩放gif和png图透明背景变成黑色的解决方法_php技巧