使用PHP反转颜色并保留透明度

3
我正在尝试创建一个函数,该函数接收一个PNG图像并返回其反色图像。然而,我在透明度/Alpha通道方面遇到了问题:基本上,透明像素会变成黑色或白色,因此无法保留透明度。
这是源图像的示例(当然会有所不同),它具有透明背景的PNG:
我想要反转这些颜色,同时保留透明度/alpha通道,就像Photoshop中的CTRL+I一样。我使用GD的imagefilter函数和IMG_FILTER_NEGATE参数。
代码如下:
$im = imagecreatefrompng($image_file);

imagefilter($im, IMG_FILTER_NEGATE);

header('image/png');

imagepng($im,NULL,0);

但它生成的图片如下所示:enter image description here你可以看到,透明像素变成了黑色。于是我尝试在函数imagecreatefrompng中添加alpha通道(像这个一样):
$im = imagecreatefrompng($image_file);

imagealphablending($im, false);

imagesavealpha($im, true);

imagefilter($im, IMG_FILTER_NEGATE);

header('image/png');

imagepng($im,NULL,0);

但是现在我得到的是白色而不是黑色: enter image description here 现在,问题似乎是在应用imagefilter函数后出现的。例如,如果我运行以下代码:
$im = imagecreatefrompng($image_file);

imagealphablending($im, false);

imagesavealpha($im, true);

//imagefilter($im, IMG_FILTER_NEGATE);

header('image/png');

imagepng($im,NULL,0);

输出的图像保留其透明背景,同时与原始图像完全相同。

如何反转透明PNG的颜色而不失去透明背景?

注意:这个问题与“imagecreatefrompng()会产生黑色背景而不是透明背景”不同-反转步骤是棘手的部分。


PNG格式是32位真实Alpha通道还是24位,其中一个RGB值标记为透明? - Dave S
源图像可能会以32位PNG格式提供,具有真实的Alpha通道。然而,由于图像是用户输入的,因此最好提供一种不需要事先了解此知识的通用解决方案。 - steps
我在GD中没有看到任何“获取原始字节”的函数(因此您可以对RGB进行异或,但不能是A),也没有看到可以忽略alpha通道的变换。 您可以向GD开发人员询问“仅反转颜色”变体。 - Dave S
使用32位PNG,在PHP 7.0.17上,您的第二个代码块完美地运作。您使用的是哪个版本? - timclutton
1个回答

0

以下是我处理透明背景和反转图像的方法。请注意,我使用的是base64。

$im = imagecreatefromstring(base64_decode(str_replace('data:image/png;base64,', '', $base64)));
$width = imagesx($im);
$height = imagesy($im);
$dest_image = imagecreatetruecolor($width, $height);
imagealphablending($dest_image, FALSE);
imagesavealpha($dest_image, TRUE);
imagefilter($im, IMG_FILTER_NEGATE);
imagecopyresampled($dest_image, $im, 0, 0, 0, 0, $width, $height, $width, $height); 

//optional output back to base64 or use imagepng with destination
ob_start();
imagepng($dest_image);
$contents = ob_get_contents();
ob_end_clean();
$base64 = 'data:image/png;base64,'.base64_encode($contents);

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