2016-05-13 138 views
1

是否可以做到以下几点:使用compositeImage设置不透明度像素的绘图

我有两个图像,一个是从画布中的背景是透明的图。另一个是灰度图,其中每个像素是白色或黑色。

我想找到一种方法将原始图形中的像素设置为完全不透明度,其中黑色像素存在于第二个图像中。

我会提供输入图纸,以及我想要摆脱的内容。输出是由我绘制的,而我想使用compositeImage或其他Imagick调用来实现我的目标。

输入1:Input 1输入2输出Input 2Output Image

再次,它们都.png格式,但intput和输出具有不透明度,其中,中间的一个是灰度。

回答

2

我相信你想要的技术是合成两个alpha通道,然后复制结果作为原始图像的新alpha通道。例如...

$drawing = new Imagick('drawing.png'); 
$mask = new Imagick('mask.png'); 
// Extract original alpha channel from drawing. 
$base_opacity = clone $drawing; 
$base_opacity->setImageAlphaChannel(Imagick::ALPHACHANNEL_EXTRACT); 
// Composite both alpha channels 
$base_opacity->compositeImage($mask, Imagick::COMPOSITE_MULTIPLY, 0 ,0); 
// Copy new `base_opacity` as alpha channel 
$drawing->compositeImage($base_opacity, Imagick::COMPOSITE_COPYOPACITY, 0 ,0); 

这里有一个一步一步的预览上面的线。

// Extract original alpha channel from drawing. 
$base_opacity = clone $drawing; 
$base_opacity->setImageAlphaChannel(Imagick::ALPHACHANNEL_EXTRACT); 

base_opacity

// Composite both alpha channels 
$base_opacity->compositeImage($mask, Imagick::COMPOSITE_MULTIPLY, 0 ,0); 

base_opacity2.png

// Copy new `base_opacity` as alpha channel 
$drawing->compositeImage($base_opacity, Imagick::COMPOSITE_COPYOPACITY, 0 ,0); 

final

+1

我用不同的技术进行试验,但没有保持从非透明像素的alpha通道在原始图像中在一天结束时。哪些工作,但低于我想要的标准。 您的解决方案非常完美。 – justynnuff

+0

请记住这两个alpha通道是基本的黑白图像,可以[以不同的方式组合](http://www.imagemagick.org/Usage/compose/tables/)。 – emcconville