1

我有一个像素的 RGB 元组,我们称之为 P。

(255, 0, 0) 是 Alpha 通道为 1.0 的 P 的颜色。

Alpha 通道为 0.8 时,P 的颜色变为 (255, 51, 51)。

如何获得影响 P 颜色的像素颜色?

4

2 回答 2

6

让我们从头开始。带有 alpha 的像素只有在与其他东西混合时才有意义。如果你有一个带有 alpha 的上层 U 和一个完全不透明的下层 L,则方程为:

P = (alpha * U) + ((1.0 - alpha) * L)

重新排列公式,您将获得:

L = (P - (alpha * U)) / (1.0 - alpha)

显然,当 alpha 为 1.0 时,该等式没有意义,因为您将被零除。

将您的数字代入显示像素 L 的 R=255、G=255 和 B=255。

按照惯例,图像中的最低层将全是白色(255,255,255)几乎是普遍的。

于 2011-01-30T04:01:27.453 回答
3

只需查看您提供的数字:

(1.0-0.8)*255 ~= 50.9 = 51

在哪里:

  • 1.0 是最大 alpha 强度
  • 0.8 是当前设置的 alpha 强度
  • 255 是每个 RGB 通道的最大强度(背景颜色)

这适合您示例的 B 和 G 通道。

因此,在一般情况下,它似乎是通道值(RGB 之一)和背景颜色(在您的情况下为白色 - 255)之间的简单加权平均值。Alpha 被用作权重。

这是一些Python代码:

MIN_ALPHA=0.0
MAX_ALPHA=1.0
MIN_CH=0
MAX_CH=255
BG_VAL=255

def apply_alpha(old, alpha, bg=255):
    assert alpha >= MIN_ALPHA
    assert alpha <= MAX_ALPHA
    assert old >= MIN_CH
    assert old <= MAX_CH

    new = old*alpha + (MAX_ALPHA - alpha)*bg
    return new

if __name__ == '__main__':
    import sys
    old, alpha = map(float, sys.argv[1:])
    print apply_alpha(old, alpha)

还有一些输出:

misha@misha-K42Jr:~/Desktop/stackoverflow$ python alpha.py 255 0.8
255.0
misha@misha-K42Jr:~/Desktop/stackoverflow$ python alpha.py 0 0.8
51.0

试试这个用于其他示例(特别是非白色背景)——它可能就是这么简单。如果没有,请使用新示例编辑您的答案,我再看看。

于 2011-01-30T03:00:08.833 回答