Convertendo ARBG para RGB com mistura alfa

votos
19

Vamos dizer que temos uma cor ARGB:

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

Quando isso é pintado no topo de uma cor existente, as cores se misturarão. Então, quando ele é misturado com o branco, a cor resultante éColor.FromARGB(255, 162, 133, 255);

A solução deve funcionar assim:

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);

O que é ToRGBa implementação 's?

Publicado 05/08/2008 em 21:12
fonte usuário
Em outras línguas...                            


3 respostas

votos
16

É chamado alpha blending .

Em psuedocode, assumindo que a cor do fundo (mistura) tem sempre 255 alfa. Também assume alfa é 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()

Atenção: você provavelmente precisará ser um pouco (mais) cuidado com ponto flutuante matemática / int e questões de arredondamento, dependendo da linguagem. intermediários expressos em conformidade

Editado para acrescentar:

Se você não tem uma cor de fundo com um alfa de 255, a álgebra fica muito mais complicado. Já fiz isso antes e é um exercício divertido esquerda para o leitor (se você realmente precisa saber, fazer outra pergunta :).

Em outras palavras, o que C misturas de cores em alguns fundo o mesmo que a mistura A, em seguida, mistura B. Este é um tipo de cálculo de A + B (que não é o mesmo que B + A).

Respondeu 05/08/2008 em 21:16
fonte usuário

votos
4

Eu sei que isto é uma discussão antiga, mas eu quero acrescentar o seguinte:

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));
}
Respondeu 26/06/2013 em 11:52
fonte usuário

votos
2

se você não precisa saber esta pré-renderização, você pode sempre usar o método win32 de GetPixel, eu acredito.

Nota: digitando em iPhone no meio do Missouri, sem acesso inet. Vai olhar para cima exemplo real win32 e ver se há um .net equivalente.

No caso de alguém se importa, e não quiser usar o (excelente) resposta postada acima, você pode obter o valor da cor de um pixel na Net através deste link MSDN exemplo

Respondeu 06/08/2008 em 07:39
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more