Conversia ARBG RGB cu alfa amestecare

voturi
19

Să presupunem că avem o culoare ARGB:

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

Atunci când acest lucru este pictat pe partea de sus a unei culori existente, culorile se vor amesteca. Deci, atunci când este amestecat cu alb, culoarea rezultată esteColor.FromARGB(255, 162, 133, 255);

Soluția ar trebui să funcționeze astfel:

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

Ce este ToRGBe de punere în aplicare?

Întrebat 05/08/2008 la 21:12
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
16

Se numește alfa amestecare .

În psuedocode, presupunând culoarea de fundal (amestec) are întotdeauna 255 alfa. De asemenea, presupune alfa este 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()

rețineți: probabil că trebuie să fie un pic (mai mult) atent cu privire la virgulă flotantă / int matematică și probleme de rotunjire, în funcție de limbă. intermediarii Cast în consecință

Editat pentru a adăuga:

Dacă nu aveți o culoare de fundal, cu un alfa de 255, algebra devine foarte mult mai complicat. Am făcut-o înainte și este un exercițiu distractiv la stânga pentru cititor (dacă într-adevăr trebuie să știți, o altă întrebare :).

Cu alte cuvinte, ceea ce C culoare contopeste unele de fundal la fel ca și amestecare A, apoi amestecarea B. Acesta este un fel de calcul A + B (care nu este același lucru ca și B + A).

Publicat 05/08/2008 la 21:16
sursa de către utilizator

voturi
4

Știu că acest lucru este un fir de vechi, dar vreau să adăugați acest lucru:

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));
}
Publicat 26/06/2013 la 11:52
sursa de către utilizator

voturi
2

dacă nu aveți nevoie să știe acest lucru de pre-randare, ai putea folosi întotdeauna metoda win32 de getpixel, cred.

Notă: tastarea pe iPhone în mijlocul Missouri fără acces inet. Se va căuta exemplu win32 reale și a vedea dacă există un echivalent .net.

În cazul în care cineva îi pasă, și nu vrea să folosească răspunsul (excelent) postat mai sus, puteți obține valoarea de culoare a unui pixel în .Net prin intermediul acestui link MSDN exemplu

Publicat 06/08/2008 la 07:39
sursa de către utilizator

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