在图像中用透明替换多个颜色

时间:2018-01-09 14:16:48

标签: php image gd imagick

我有一个雨雷​​达图像,灰色和白色的大部分为背景。我需要删除背景(灰色/白色)并使其透明。但它不起作用。我已经尝试了

   // replace white
   $rgb = imagecolorexact($im, 255, 255, 255);
   imagecolortransparent($im, $rgb);
   // replace grey
   $rgb = imagecolorexact($im, 189, 189, 189);
   imagecolortransparent($im, $rgb);

但这不起作用。它只有一部分透明(白色或灰色)。我无法同时删除这两种颜色。

我真的不知道图片是如何工作的......所以,如果你知道如何实现我想要的东西,请告诉我。

由于

enter image description here

2 个答案:

答案 0 :(得分:0)

首先,将所有灰色像素设为白色。然后使所有白色像素透明。就是这样。再读一遍: - )

请参阅PHP GD documentation以查看实际参数和详细信息。

// Load up the original image
$src=imagecreatefrompng('weather.png');

// Ensure image is palettised
if(imageistruecolor($src)){
   imagetruecolortopalette($src);
}

// Find nearest colours to white and grey 189
$whiteindex=imagecolorclosest($src,255,255,255);
$greyindex =imagecolorclosest($src,189,189,189);

// Make all greys white and all nearly whites white, and both transparent
imagecolorset($src,$greyindex,255,255,255,127);
imagecolorset($src,$whiteindex,255,255,255,127);

// Write result 
imagepng($src,"result.png");

请注意,您开始使用的代码以及上面的代码是使用随大多数PHP解释程序准备安装的 GD 库。相反,您可以使用 IMagick 库( ImageMagick 的PHP绑定),它更加全面。您的代码将变为:

// Move to a format which supports transparency
$imagick->setimageformat('png');

// Set $color to white first
$imagick->transparentPaintImage($color, $alpha, 10 * \Imagick::getQuantum(),false);

// Set $color to grey first
$imagick->transparentPaintImage($color, $alpha, 10 * \Imagick::getQuantum(),false);

答案 1 :(得分:0)

在Imagemagick中,您可以转换为HCL色彩空间并选择C(色度)饱和度通道和阈值为0.这会将所有灰色/黑色/白色像素设置为黑色,将所有颜色像素设置为白色。然后将结果放入原始图像的Alpha通道。这假定原始图像是展平图像并且没有其他图层。如果没有,那么展平图像

convert radar.png \( +clone -colorspace HCL -channel 1 -separate -threshold 0 \) -alpha off -compose copy_opacity -composite result.png


注意通道的编号从0(红色或青色),1(绿色或品红色)和2(蓝色或黄色)开始。您可以使用数字或名称。 Imagemagick不会通过颜色空间通道名称跟踪其他颜色空间的颜色。所以这里使用1或绿色。

enter image description here

生成的图像具有透明度,但由于白色背景颜色,在上面显示为白色。