c# -使用alpha混合将ARBG转换为RGB

Translate

假设我们有一种ARGB颜色:

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

当将其绘制在现有颜色之上时,颜色将融合。因此,当它与白色混合时,得到的颜色是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的实现?

This question and all comments follow the "Attribution Required."

所有的回答

Translate

叫做Alpha混合.

在伪代码中,假定背景色(混合色)始终具有255 alpha。还假设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不同)。

来源
Translate

我知道这是一个旧线程,但是我想添加以下内容:

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));
}
来源
Translate

我相信,如果您不需要了解此预渲染,则可以始终使用getpixel的win32方法。

注意:在密苏里州中部的iPhone上键入,无法访问inet。将查找真实的win32示例,并查看是否有.net等效项。

如果有人在乎,并且不想使用上面发布的(优秀)答案,则可以通过此链接获取.Net中像素的颜色值MSDN示例

来源