fórmula Blend para GDI +
-
19-09-2019 - |
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
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.