【问题标题】:How are the blended colors computed in this case?在这种情况下如何计算混合颜色?
【发布时间】:2019-10-31 11:43:52
【问题描述】:

这是一个关于 alpha 混合的预期结果的问题。

设置如下: 背景颜色为透明黑色 (0, 0, 0, 0.18)。 绘图颜色为半透明绿色(0、1、0、0.5)。

这是图形编辑器 (GIMP) 中的结果:

生成的颜色为 (0, 0.93, 0, 0.59)。

如果我们将这些颜色与颜色混合公式 C1 * (1 - A2) + C2 * A2 混合并计算 alpha A1 * (1 - A2) + A2,我们会得到 (0, 0.5, 0, 0.59)。

Alpha 是正确的,颜色不是。输出颜色为灰绿色。这在白色背景上变得非常明显。

这里有什么问题?编辑器是否使用不同的混合公式(那么它们是什么)?我的计算错了吗?

【问题讨论】:

    标签: graphics colors alpha blending


    【解决方案1】:

    首先,如果我创建一个像你这样的图像,我会得到最终颜色(0, 0.863, 0, 0.59)。所以你可能想检查你的输入。

    混合颜色有点棘手。您显示的公式 (C1 * (1 - A2) + C2 * A2) 是将颜色与纯色背景颜色混合的公式。但是我们没有纯色的背景色。我们想要做的是找到一种混合颜色(C, A),这样这种颜色混合在任何纯背景颜色CB 上产生的结果与首先在背景上混合(C1, A1),然后在结果颜色上混合(C2, A2) 产生相同的结果。我们可以用以下等式表示:

    A * C + (1 - A) * CB = A2 * C2 + (1 - A2) * (A1 * C1 + (1 - A1) * CB)
    

    经过一些重新安排:

    A * C - A * CB = A2 * C2 + A1 * C1 - A2 * A1 * C1 + (A1 * A2 - A1 - A2) * CB
    

    由此可知CB的两个因子在两侧必须匹配,即

    - A = A1 * A2 - A1 - A2
    

    因此

    A = A1 + A2 - A1 * A2
    

    颜色等于

    A * C = A2 * C2 + A1 * C1 - A2 * A1 * C1
        C = (A2 * C2 + A1 * C1 - A2 * A1 * C1) / A
    

    在这种情况下,计算结果为0.8470.866 的观测值仍有细微差别,但我认为这是一个舍入误差。

    还要注意 GIMP 有两种合成模式。线性RGB模式和感知模式。感知模式大概是在经过伽马校正的空间中进行混合。

    【讨论】:

    • 这与我发现的类似。首先像我之前或使用1 - (1 - A1) * (1 - A2) 一样找出生成的alpha A。颜色公式为(C1 * A1 * (1 - A2) + C2 * A2) / A。基本上C1 * (1 - A2) + C2 * A2 是正确的,只有预乘的背景颜色和结果 alpha 的除法。
    猜你喜欢
    • 2019-06-13
    • 1970-01-01
    • 2018-12-26
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多