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 ToRGBaplicación?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top