【问题标题】:How to combine two colors with varying alpha values如何组合具有不同 alpha 值的两种颜色
【发布时间】:2015-05-08 03:57:38
【问题描述】:

我有两种颜色,c₀ 和 c₁。它们具有可变的 alpha、红色、绿色和蓝色值:(a₀, r₀, b₀, g₀) 和 (a₁, r₁, b₁, g₁)。我想知道是否有一个简单的公式可以组合这些颜色以获得正确的新颜色 (c₂)。

假设 c₀ 覆盖 c₁。我知道,如果它们具有相同的 alpha 值,那么平均它们的比较红色、绿色和蓝色值就可以了。但是当 alpha 值不同时,我注意到这不能正常工作 - 似乎 alpha 决定了每种颜色的 RGB 值对最终颜色的“贡献”级别。

另有说明,

If a₀=a₁ then:
    a₂=a₀=a₁,
    r₂=(r₀+r₁)/2,
    g₂=(g₀+g₁)/2,
    b₂=(b₀+b₁)/2
Else:
    a₂=(a₀+a₁)/2,
    r₂=?,
    g₂=?,
    b₂=?

【问题讨论】:

标签: colors formula alpha color-blending


【解决方案1】:

简答:

如果我们想用一些 alpha 覆盖 c0 到 c1 上,那么

a01 = (1 - a0)·a1 + a0

r01 = ((1 - a0)·a1·r1 + a0·r0) / a01

g01 = ((1 - a0)·a1·g1 + a0·g0) / a01

b01 = ((1 - a0)·a1·b1 + a0·b0) / a01

注意在公式中除以a01 表示颜色的成分。这很重要。

长答案:

当c0用alpha a0覆盖不透明的c1时颜色的基本公式是

r0 大于 1 = (1 - a0)·r1 + a0·r 0

// g & b 组件相同

所以如果有另一种颜色 c2 并且 c1 实际上不是不透明的但有一个 alpha a1 我们可以先覆盖 c 1 覆盖 c2 ,然后 c0 覆盖结果颜色。

r1 over 2 = (1 - a1)·r2 + a1·r 1

r0 over (1 over 2) = (1 - a0)·((1 - a1)·r2 + a1·r1) + a0·r0

如果我们有一个颜色 c01 覆盖 c2 与覆盖第一个 c1 然后 c 的结果相同0 应该是这样的:

r01 over 2 = (1 - a01)·r2 + a01·r 01

好的,让它们相等:

(1 - a01)·r2 + a01·r01 = (1 - a0)·((1 - a1)·r2 + a1·r 1) + a0·r0 = (1 - a0)·(1 - a1)·r2 + (1 - a0)·a1·r1 + a0·r0

所以

1 - a01 = (1 - a0)·(1 - a1) = 1 - ((1 - a 0)·a1 + a0)

a01·r01 = (1 - a0)·a1·r1 + a0·r0

【讨论】:

  • 想要了解更多内容的朋友,请查看维基百科关于 alpha compositing 的条目:en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending
  • 最后一个公式有个问题:如果a * r + b = c * r + d,那么a = c, b = d?我有一个相反的例子:2* 3 + 3 = 1* 3 + 6
猜你喜欢
  • 2011-04-09
  • 1970-01-01
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 2016-03-15
  • 1970-01-01
相关资源
最近更新 更多