如何修改alpha预乘图像不透明度?

时间:2015-08-21 15:29:48

标签: alphablending blending pixman

我有一个alpha预乘图像,需要更改它的不透明度。应用于图像的不透明度变化可以是0.0到1.0。

使用以下公式很容易实现此过程:

Cn = C*alpha;
An = A*alpha;

然而,我正试图避免自己编写这段代码并允许高度优化的库pixman完成这项工作。它们提供了各种混合选项,但我不太清楚如何使用蒙版或使用哪种混合选项。我尝试过使用MULTIPLY,但这只是让图像变得更暗,我猜...

我应该使用哪种潜在混合选项的想法?

{ "CLEAR",      PIXMAN_OP_CLEAR },
    { "SRC",        PIXMAN_OP_SRC },
    { "DST",        PIXMAN_OP_DST },
    { "OVER",       PIXMAN_OP_OVER },
    { "OVER_REVERSE",   PIXMAN_OP_OVER_REVERSE },
    { "IN",     PIXMAN_OP_IN },
    { "IN_REVERSE", PIXMAN_OP_IN_REVERSE },
    { "OUT",        PIXMAN_OP_OUT },
    { "OUT_REVERSE",    PIXMAN_OP_OUT_REVERSE },
    { "ATOP",       PIXMAN_OP_ATOP },
    { "ATOP_REVERSE",   PIXMAN_OP_ATOP_REVERSE },
    { "XOR",        PIXMAN_OP_XOR },
    { "ADD",        PIXMAN_OP_ADD },
    { "SATURATE",   PIXMAN_OP_SATURATE },

    { "MULTIPLY",   PIXMAN_OP_MULTIPLY },
    { "SCREEN",     PIXMAN_OP_SCREEN },
    { "OVERLAY",    PIXMAN_OP_OVERLAY },
    { "DARKEN",     PIXMAN_OP_DARKEN },
    { "LIGHTEN",    PIXMAN_OP_LIGHTEN },
    { "COLOR_DODGE",    PIXMAN_OP_COLOR_DODGE },
    { "COLOR_BURN", PIXMAN_OP_COLOR_BURN },
    { "HARD_LIGHT", PIXMAN_OP_HARD_LIGHT },
    { "SOFT_LIGHT", PIXMAN_OP_SOFT_LIGHT },
    { "DIFFERENCE", PIXMAN_OP_DIFFERENCE },
    { "EXCLUSION",  PIXMAN_OP_EXCLUSION },
    { "HSL_HUE",    PIXMAN_OP_HSL_HUE },
    { "HSL_SATURATION", PIXMAN_OP_HSL_SATURATION },
    { "HSL_COLOR",  PIXMAN_OP_HSL_COLOR },
    { "HSL_LUMINOSITY", PIXMAN_OP_HSL_LUMINOSITY },

这是实际的复合函数:

void pixman_image_composite(pixman_op_t        op,
                           pixman_image_t    *src,
                           pixman_image_t    *mask,
                           pixman_image_t    *dest,
                           int16_t            src_x,
                           int16_t            src_y,
                           int16_t            mask_x,
                           int16_t            mask_y,
                           int16_t            dest_x,
                           int16_t            dest_y,
                           uint16_t           width,
                           uint16_t           height);

1 个答案:

答案 0 :(得分:0)

解决方案实际上非常简单。一开始我没有想太多的面具。然后我意识到啊面具当然就像Photoshop一样。

因此,应用具有正确alpha值的遮罩将导致图像改变其不透明度。

因此,将图像不透明度更改为50%,我们将使用白色和alpha值为50%的蒙版。