Conversione ARBG di RGB con alpha blending

voti
19

Diciamo che abbiamo un colore ARGB:

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

Quando questo è dipinta su di un colore esistente, i colori si fondono. Così, quando si è mescolato con il bianco, il colore risultante èColor.FromARGB(255, 162, 133, 255);

La soluzione dovrebbe funzionare in questo modo:

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

Che cosa è ToRGB's implementazione?

È pubblicato 05/08/2008 alle 21:12
fonte dall'utente
In altre lingue...                            


3 risposte

voti
16

Si chiama alpha blending .

In psuedocodarlo, assumendo il colore di sfondo (blend) è sempre 255 alfa. presuppone inoltre 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()

nota: probabilmente avete bisogno di essere un po '(più) attenti a virgola mobile / int la matematica e le questioni di arrotondamento, a seconda della lingua. intermedi espressi conseguenza

A cura di aggiungere:

Se non si dispone di un colore di sfondo con un alfa del 255, l'algebra diventa molto più complicato. L'ho fatto prima ed è un esercizio divertente lasciato al lettore (se si ha realmente bisogno di sapere, fare un'altra domanda :).

In altre parole, ciò C colore fonde in qualche sfondo uguale miscelazione A, quindi la miscelazione B. Questa è una specie di calcolo A + B (che non è la stessa di B + A).

Risposto il 05/08/2008 a 21:16
fonte dall'utente

voti
4

So che questo è un vecchio thread, ma voglio aggiungere questo:

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));
}
Risposto il 26/06/2013 a 11:52
fonte dall'utente

voti
2

se non hai bisogno di sapere questo pre-render, si può sempre utilizzare il metodo Win32 di getPixel, credo.

Nota: digitando su iPhone nel bel mezzo del Missouri senza accesso inet. Cercherà vero esempio Win32 e vedere se c'è un .net equivalente.

Nel caso qualcuno si prende cura, e non vuole utilizzare la (eccellente) risposta postato sopra, è possibile ottenere il valore del colore di un pixel in Net tramite questo link MSDN esempio

Risposto il 06/08/2008 a 07:39
fonte dall'utente

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