Pregunta

I tienen un color A que me gustaría para transformar en color de C, mediante el uso de color B. Así que me gustaría saber la fórmula de mezcla F en GDI +, donde F = F (A, B) = C. A es el "color de fondo" y B es un color de recubrimiento por encima de A, que junto con una rendimientos C.

Saludos,

// Magnus

¿Fue útil?

Solución

Esto se llama Fundido alfa .

Utiliza el siguiente algoritmo para el R, G, y los componentes B, donde alfa es entre 0 y 1.

newColor = MAX(255, (1 - alpha) * background + alpha * overlay)

Otros consejos

Básicamente (alfa, rojo verde y azul en una escala de 0 a 1):

Result.Alpha = BackColor.Alpha + ForeColor.Alpha - (BackColor.Alpha * ForeColor.Alpha)
Result.Red = ((* ForeColor.Red ForeColor.Alpha) + (* BackColor.Red BackColor.Alpha * (1 - ForeColor.Alpha))) / Result.Alpha
(Sustituir 'rojo' con 'verde' y 'azul' de arriba para obtener las funciones correspondientes.)

Para obtener un color de 32 bits, en VB.NET (algo optimizado):

Shared Function Flatten(ByVal BackColor As Color, ByVal ForeColor As Color) As Color
    If ForeColor.A = 0 Then Return BackColor ' Prevent division by zero
    If ForeColor.A = 255 Then Return ForeColor ' Shortcut

    Dim BackAlphaDbl As Single = CSng(BackColor.A) ' Convert to single to prevent in-calculation 8 bit overflow 
    Dim ForeAlphaDbl As Single = CSng(ForeColor.A)

    Dim ForeAlphaNormalized As Single = ForeAlphaDbl / 255 ' Precalculate for triple use
    Dim BackcolorMultiplier As Single = BackAlphaDbl * (1 - ForeAlphaNormalized) ' Precalculate 

    Dim Alpha As Single = BackAlphaDbl + ForeAlphaDbl - BackAlphaDbl * ForeAlphaNormalized

    Return Color.FromArgb(Alpha, (ForeColor.R * ForeAlphaDbl + BackColor.R * BackcolorMultiplier) / Alpha, (ForeColor.G * ForeAlphaDbl + BackColor.G * BackcolorMultiplier) / Alpha, (ForeColor.B * ForeAlphaDbl + BackColor.B * BackcolorMultiplier) / Alpha)
End Function

Me di cuenta de esto con papel y lápiz y la verificaron mediante la superposición de imágenes con GDI + y probar los colores resultantes. La única diferencia entre esta función y GDI + es que GDI + redondea hacia arriba y abajo de manera incompatible como los cambios alfa de primer plano. Esta función es más precisa.

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