使用alpha混合将ARBG转换为RGB

假设我们有一个ARGB颜色:

Color argb = Color.FromARGB(127, 69, 12, 255); //Light Urple.

When this is painted on top of an existing color, the colors will blend. So when it is blended with white, the resulting color is Color.FromARGB(255, 162, 133, 255);

解决方案应该像这样工作:

Color blend = Color.White; 
Color argb = Color.FromARGB(127, 69, 12, 255); //Light Urple.      
Color rgb = ToRGB(argb, blend); //Same as Color.FromARGB(255, 162, 133, 255);

什么是 ToRGB 的实现?

0
额外 编辑
意见: 1
我只想说,我发现“Light Urple”已经在4次编辑中幸存下来了。
额外 作者 Matt Dawdy,

3 答案

它被称为 alpha混合

在psuedocode中,假设背景颜色(混合)总是有255个字母。还假设alpha是0-255。

alpha=argb.alpha()
r = (alpha/255)*argb.r() + (1 - alpha/255)*blend.r()
g = (alpha/255)*argb.g() + (1 - alpha/255)*blend.g()
b = (alpha/255)*argb.b() + (1 - alpha/255)*blend.b()

注意:根据语言的不同,您可能需要对浮点/整数运算和舍入问题进行一点(更多)小心。相应地铸造中间体

编辑添加:

如果你没有背景颜色的alpha值为255,代数会变得更加复杂。我之前做过,这对读者来说是一个有趣的练习(如果你真的需要知道,请提出另一个问题:)。

换句话说,什么颜色C混合到一些背景,就像混合A,然后混合B.这就像计算A + B(它不同于B + A)。

0
额外

如果你不需要知道这个预渲染,我相信你总是可以使用getpixel的win32方法。

注意:在密苏里州中部的iPhone上打字,没有任何访问权限。将查找真正的win32示例,并查看是否存在.net等效项。

In case anyone cares, and doesn't want to use the (excellent) answer posted above, you can get the color value of a pixel in .Net via this link MSDN example

0
额外

我知道这是一个古老的线程,但我想补充一点:

Public Shared Function AlphaBlend(ByVal ForeGround As Color, ByVal BackGround As Color) As Color
    If ForeGround.A = 0 Then Return BackGround
    If BackGround.A = 0 Then Return ForeGround
    If ForeGround.A = 255 Then Return ForeGround
    Dim Alpha As Integer = CInt(ForeGround.A) + 1
    Dim B As Integer = Alpha * ForeGround.B + (255 - Alpha) * BackGround.B >> 8
    Dim G As Integer = Alpha * ForeGround.G + (255 - Alpha) * BackGround.G >> 8
    Dim R As Integer = Alpha * ForeGround.R + (255 - Alpha) * BackGround.R >> 8
    Dim A As Integer = ForeGround.A

    If BackGround.A = 255 Then A = 255
    If A > 255 Then A = 255
    If R > 255 Then R = 255
    If G > 255 Then G = 255
    If B > 255 Then B = 255

    Return Color.FromArgb(Math.Abs(A), Math.Abs(R), Math.Abs(G), Math.Abs(B))
End Function

public static Color AlphaBlend(Color ForeGround, Color BackGround)
{
    if (ForeGround.A == 0)
        return BackGround;
    if (BackGround.A == 0)
        return ForeGround;
    if (ForeGround.A == 255)
        return ForeGround;

    int Alpha = Convert.ToInt32(ForeGround.A) + 1;
    int B = Alpha * ForeGround.B + (255 - Alpha) * BackGround.B >> 8;
    int G = Alpha * ForeGround.G + (255 - Alpha) * BackGround.G >> 8;
    int R = Alpha * ForeGround.R + (255 - Alpha) * BackGround.R >> 8;
    int A = ForeGround.A;

    if (BackGround.A == 255)
        A = 255;
    if (A > 255)
        A = 255;
    if (R > 255)
        R = 255;
    if (G > 255)
        G = 255;
    if (B > 255)
        B = 255;

    return Color.FromArgb(Math.Abs(A), Math.Abs(R), Math.Abs(G), Math.Abs(B));
}
0
额外