【问题标题】:Use compositeImage to set pixel opacity in a drawing使用 CompositeImage 设置绘图中的像素不透明度
【发布时间】:2016-05-13 18:48:08
【问题描述】:

是否可以做到以下几点:

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

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

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

输入1:Input 2Output

同样,它们都是.png格式,但是输入和输出是不透明的,中间是灰度的。

【问题讨论】:

    标签: php imagemagick imagick


    【解决方案1】:

    我相信您想要的技术是合成两个 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);
    

    【讨论】:

    • 我尝试了不同的技术,但最终都没有保留原始图像中不透明像素的 Alpha 通道。哪个有效,但低于我想要的标准。您的解决方案非常完美。
    • 记住两个 alpha 通道是基本的黑白图像,可以是 combined in different ways
    猜你喜欢
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2011-04-27
    • 2014-09-05
    相关资源
    最近更新 更多