Vă mulțumim pentru susținere

Convertirea ARBG la RGB cu amestecare alfa

Să presupunem că avem o culoare ARGB:

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

When this is painted on top of an existing color, the colors will blend. So when it is blended with white, the resulting color is Color.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 implementarea ToRGB ?

0
adăugat editat
Vreau doar să spun că mi se pare minunat că "Light Urple" a supraviețuit 4 editări.
adăugat autor Matt Dawdy

3 răspunsuri

Se numește amestecare alfa .

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

Notă: Probabil că trebuie să fii mai atent (mai mult) cu privire la problemele legate de floating-point / int math și rotunjire, în funcție de limbă. Distribuie intermediari în consecință

Editat pentru a adăuga:

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

Cu alte cuvinte, ce culoare C se amestecă într-un anumit fundal, la fel ca amestecarea lui A, apoi amestecarea lui B. Este un fel de calcul al lui A + B (care nu este același cu B + A).

0
adăugat

dacă nu aveți nevoie să știți această pre-render, ați putea folosi întotdeauna metoda win32 a getpixel, cred.

Notă: tastați pe iPhone în mijlocul Missouri fără acces inet. Vom arăta exemplul real win32 și vom vedea dacă există un echivalent .net.

In case anyone cares, and doesn't want to use the (excellent) answer posted above, you can get the color value of a pixel in .Net via this link MSDN example

0
adăugat

Știu că este un fir vechi, dar vreau să adaug 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));
}
0
adăugat