La conversión de ARBG a RGB con mezcla alfa
Pregunta
Supongamos que tenemos una ARGB de color:
Color argb = Color.FromARGB(127, 69, 12, 255); //Light Urple.
Cuando este está pintado en la parte superior de un color, 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 debería funcionar como este:
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);
¿Qué es ToRGB
aplicación?
Solución
Se llama alpha blending.
En psuedocode, suponiendo que el color de fondo (mezcla) siempre tiene 255 alfa.También se supone alfa es de 0 a 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:usted probablemente necesita ser un poco (más) cuidado acerca de punto flotante/int matemáticas y problemas de redondeo, dependiendo del idioma.Cast intermedios en consecuencia
Editado para añadir:
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 a la izquierda para el lector (si usted realmente necesita saber, hacer otra pregunta :).
En otras palabras, ¿de qué color C se funde con algunos antecedentes de la misma como la combinación de Una, luego de fusión B.Esta es una especie de como calcular a+B (que no es lo mismo que B+A).
Otros consejos
Sé que este es un hilo viejo, pero quiero añadir 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));
}
si usted no necesita saber de este pre-procesamiento, siempre se puede usar el win32 método getpixel, creo.
Nota:escribir en el iPhone en el centro de Missouri sin inet acceso.Buscará real win32 ejemplo y ver si hay una .neta equivalente.
En caso de que alguien se interesa, y no desea utilizar el (excelente) respuesta publicada anteriormente, usted puede obtener el valor de color de un píxel .Neto a través de este enlace Ejemplo de MSDN