将半透明颜色转换为实色的算法

6
假设我在白色背景上有颜色rgba(255, 0, 0, 0.5)。可以看到的颜色几乎与实色颜色rgba(255, 140, 140, 1)相同。我正在寻找一种算法,将半透明颜色(在白色上方)转换为实色,以便在彼此附近时看起来(几乎)相同(如下图所示)。

Two rectangles with diferent colors that look the same on a white background

我注意到如果有2个分量(r、g或b)为0,则必须保留非空分量的值,并调整空分量的值,使其匹配权重颜色。这个值(我猜)取决于半透明颜色的alpha分量。但我似乎找不到公式。其他情况呢?我认为一定有一个通用公式可以应用。
我正在寻找伪代码、JavaScript、Java、Python、C#或C++的答案。
此外,我没有在任何项目上工作。这个问题是为了学习和帮助可能需要它的人。
1个回答

13

我知道将rgba转换为rgb的公式

function rgba2rgb(background, color) {
    const alpha = color[3]

  return [Math.floor((1 - alpha) * background[0] + alpha * color[0] + 0.5),
        Math.floor((1 - alpha) * background[1] + alpha * color[1] + 0.5),
        Math.floor((1 - alpha) * background[2] + alpha * color[2] + 0.5)]
}

console.log(rgba2rgb([255, 255, 255], [255, 0, 0, 0.5])) // [ 255, 128, 128 ]

但这并不适用于你的例子


这正是我想要的,只是我的颜色是以CSS格式"rgb(r,g,b)"表示的,但我可以自己解决。 - Stefan Octavian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接