【问题标题】:Color over color: how to get the resulting color?颜色超过颜色:如何获得结果颜色?
【发布时间】:2015-09-19 23:59:54
【问题描述】:

我有下一个任务:

  • 假设有两种颜色:color1 和 color2
  • color1 是半透明的(color2 可能也是)
  • 我知道 color1 和 color2 的 ARGB 值
  • 如何获取颜色的 ARGB 值,将颜色 1 和颜色 2 叠加,反之亦然?

这是我正在寻找的图像:

这是一个代码 sn-p (C#):

    private Color getOverlapColor(Color frontColor, Color backColor)
    {
        //return...
    }

【问题讨论】:

  • 这取决于混合模式。通过查看混合颜色的 ARGB 值应该很容易确定。或者也许不是:)

标签: colors transparency


【解决方案1】:

最简单的方法是假设一个线性比例。

int blend(int front, int back, int alpha)
    => back + (front - back) * alpha / 255;

然后:

Color getOverlapColor(Color front, Color back)
{
    var r = blend(front.Red, back.Red, front.Alpha);
    var g = blend(front.Green, back.Green, front.Alpha);
    var b = blend(front.Blue, back.Blue, front.Alpha);
    var a = unsure;
    return new Color(r, g, b, a);
}

我不确定如何计算得到的 alpha:

  • 如果front.Alphaback.Alpha 都为0,则结果也是0。
  • 如果front.Alpha 为0,则结果为back.Alpha
  • 如果front.Alpha 为255,则back.Alpha 的值无关紧要。
  • 如果front.Alphaback.Alpha 都是50%,则结果必须大于50%。

但我确信有人已经弄清楚了以上所有内容。一些 SVG 渲染器、GIMP 或其他一些图像处理库应该已经有这个代码,经过仔细测试和实践证明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 2019-04-10
    • 2015-09-29
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多