2008-08-05 17 views
18

Lasst uns sagen, dass wir eine ARGB Farbe haben:ArbG Konvertieren mit Alpha RGB Mischen

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

Wenn diese auf einer bestehenden Farbe gemalt wird, vermischen sich die Farben. Also, wenn es mit Weiß gemischt wird, die resultierende Farbe ist Color.FromARGB(255, 162, 133, 255);

Die Lösung sollte wie folgt funktionieren:

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

Was ist ToRGB ‚s Implementierung?

+0

Ich möchte nur sagen, dass ich finde es genial, dass "Light Urple" 4 Änderungen überlebt hat. –

Antwort

16

Es heißt alpha blending.

In psuedocode, vorausgesetzt, die Hintergrundfarbe (Mischung) hat immer 255 Alpha. Nimmt auch an, Alpha ist 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() 

Hinweis: Sie müssen wahrscheinlich ein bisschen (mehr) vorsichtig über Floating-Point/int Mathematik und Rundungsprobleme sein, je nach Sprache. Gusszwischenprodukte entsprechend

Edited hinzufügen:

Wenn Sie mit einem Alpha 255 nicht über eine Hintergrundfarbe haben, die Algebra bekommt viel komplizierter. Ich habe es vorher gemacht und es ist eine lustige Übung, die dem Leser überlassen wird (wenn du es wirklich wissen musst, frage eine andere Frage :).

Mit anderen Worten, welche Farbe C in einigen Hintergrund die gleiche wie Mischen von A, dann Mischen von B. Dies ist eine Art wie die Berechnung von A + B (die nicht das gleiche wie B + A ist).

2

Wenn Sie dieses Pre-Render nicht kennen müssen, könnten Sie immer die Win32-Methode von getpixel verwenden, glaube ich.

Hinweis: Tippen auf dem iPhone in der Mitte von Missouri mit keinen inet Zugriff. Werdet echtes Win32-Beispiel nachschauen und nachsehen, ob es ein .net-Äquivalent gibt.

Falls sich jemand kümmert, und will nicht die (sehr zufrieden) Antwort gepostet oben verwenden, können Sie den Farbwert eines Pixels in .Net über diesen Link MSDN example

4

bekomme ich weiß, das ist ein altes thread, aber ich möchte hinzufügen:

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