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
?
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).
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
Ș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));
}