2008-08-05 19 views
18

Digamos que tenemos un color ARGB:conversión de ARBG a RGB con mezcla alfa

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

Cuando esto está pintado en la parte superior de un color existente, los colores se mezclan. Así que cuando se mezcla con el blanco, el color resultante es Color.FromARGB(255, 162, 133, 255);

La solución debe funcionar así:

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

¿Cuál es ToRGB 's aplicación?

+0

Solo quiero decir que me parece increíble que "Light Urple" haya sobrevivido a 4 ediciones. –

Respuesta

16

Se llama alpha blending.

En psuedocode, suponiendo que el color de fondo (combinación) siempre tiene 255 alfa. También supone que alfa es 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() 

nota: es probable que tenga que ser un poco (más) cuidado con coma flotante/int matemáticas y problemas de redondeo, en función de la lengua. intermedios elenco consecuencia

Editado para agregar:

Si usted no tiene un color de fondo con un alfa de 255, el álgebra se pone mucho más complicado. Lo he hecho antes y es un ejercicio divertido para el lector (si realmente necesita saber, haga otra pregunta :).

En otras palabras, qué color C combina en un fondo lo mismo que mezcla A, luego mezcla B. Esto es algo así como calcular A + B (que no es lo mismo que B + A).

2

si no necesita saber este pre-render, siempre puede usar el método win32 de getpixel, creo.

Nota: escribir en el iPhone en el centro de Missouri sin acceso de acceso. Buscará un ejemplo real de win32 y verá si hay un equivalente de .net.

En caso de que a alguien le interesa, y no quiere utilizar el (excelente) respuesta publicada anteriormente, se puede obtener el valor de color de un píxel en .Net a través de este enlace MSDN example

4

Sé que esto es una vieja hilo, pero quiero agregar esto:

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