Umwandeln ArbG in RGB mit Alpha-Blending

stimmen
19

Lassen Sie uns sagen, dass wir eine ARGB Farbe haben:

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

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

Die Lösung soll 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?

Veröffentlicht am 05/08/2008 um 21:12
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
16

Es heißt Alpha - Blending .

In psuedocode, die Hintergrundfarbe unter der Annahme (Blend) hat immer 255 alpha. Auch wird davon ausgegangen 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 wahrscheinlich ein bisschen (mehr) vorsichtig über Floating-Point / int Mathematik und Rundungsprobleme, je nach Sprache sein müssen. Gusszwischenprodukte entsprechend

Bearbeitet hinzufügen:

Wenn Sie nicht über eine Hintergrundfarbe mit einem Alpha von 255 haben, bekommt der Algebra viel komplizierter. Ich habe es schon getan und es ist eine nette Übung dem Leser überlassen (wenn Sie wirklich wissen müssen, eine andere Frage stellen :).

Mit anderen Worten, was Farbe C in einem gewissen Hintergrund mischt das gleiche wie ein Mischen, dann Mischen B. Dies ist eine Art, wie die Berechnung A + B (das nicht dasselbe wie B ist + A).

Beantwortet am 05/08/2008 um 21:16
quelle vom benutzer

stimmen
4

Ich weiß, das ist ein alter Thread, aber ich möchte diese hinzuzufü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));
}
Beantwortet am 26/06/2013 um 11:52
quelle vom benutzer

stimmen
2

wenn Sie diese vorrendern nicht wissen müssen, finden Sie immer die win32 Methode von getpixel verwenden könnte, glaube ich.

Hinweis: Tippen auf dem iPhone in der Mitte des Missouri ohne inet-Zugang. Wird die reale win32 Beispiel suchen und sehen, ob es eine .net entspricht.

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 erhalten MSDN Beispiel

Beantwortet am 06/08/2008 um 07:39
quelle vom benutzer

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