使用 compositeImage 设置绘图中的像素不透明度
Use compositeImage to set pixel opacity in a drawing
是否可以做到以下几点:
我有两张图片,一张是来自 canvas 的图画,其中背景是透明的。另一个是灰度图,每个像素不是白色就是黑色。
我想找到一种方法将原始绘图中的像素设置为完全不透明,而第二个图像中存在黑色像素。
我会提供输入图纸,以及我想要输出的内容。输出是由我绘制的,我想使用 compositeImage
或其他 Imagick 调用来实现我的目标。
输入 1:Input 2Output
同样,它们都是.png格式,但输入和输出有不透明度,中间是灰度。
我相信您想要的技术是合成两个 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);
// 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);
是否可以做到以下几点:
我有两张图片,一张是来自 canvas 的图画,其中背景是透明的。另一个是灰度图,每个像素不是白色就是黑色。
我想找到一种方法将原始绘图中的像素设置为完全不透明,而第二个图像中存在黑色像素。
我会提供输入图纸,以及我想要输出的内容。输出是由我绘制的,我想使用 compositeImage
或其他 Imagick 调用来实现我的目标。
输入 1:
同样,它们都是.png格式,但输入和输出有不透明度,中间是灰度。
我相信您想要的技术是合成两个 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);
// 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);