我正在尝试创建一个函数来接收 PNG 图像并以反转的颜色返回它。但是,我在透明度/alpha channel 方面遇到了问题:基本上,透明像素返回为黑色或白色,因此不保留透明度。
这是一个源图像的示例(当然会有所不同),具有透明背景的 PNG:
我想在保留透明度/alpha channel 的同时反转这些颜色,就像 Photoshop 中的 CTRL+I。我正在使用带有 IMG_FILTER_NEGATE
参数的 GD imagefilter
函数
代码:
$im = imagecreatefrompng($image_file);
imagefilter($im, IMG_FILTER_NEGATE);
header('image/png');
imagepng($im,NULL,0);
但它产生:
如您所见,透明像素变成了黑色。
然后我尝试将 alpha channel 添加到函数 imagecreatefrompng(如 this):
$im = imagecreatefrompng($image_file);
imagealphablending($im, false);
imagesavealpha($im, true);
imagefilter($im, IMG_FILTER_NEGATE);
header('image/png');
imagepng($im,NULL,0);
但现在我得到的是白色而不是黑色:
现在问题似乎发生在应用 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() Makes a black background instead of transparent? 相同的问题- 反转步骤是这里的棘手部分
最佳答案
以下是对我有用的方法,处理透明背景和反转图像。请注意,我使用的是 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);
关于php - 使用 PHP 反转颜色并保持透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44600713/