math - ¿Cómo calcular un color RGB especificando una cantidad de mezcla alfa?
colors alphablending (3)
Estoy escribiendo un selector de color que obtiene los valores RGB de píxel desde donde apunta a la pantalla. También quiero tener la opción de especificar que el color que elegí ya tiene un valor alfa. Me pregunto cómo puedo calcular el color resultante.
Por ejemplo:
El color del píxel resultante es 240,247,249, pero sé que el color original tenía una opacidad del 10% y se encontraba en la parte superior de un fondo blanco (255,255,255). ¿Cuál es el cálculo para calcular los valores RGB originales?
El siguiente pseudocódigo resuelve tu problema:
CalculateSolidColorFromTransparentColor(Color color, Color background)
{
alpha = color.A / 255;
oneminusalpha = 1 - alpha;
newR = ((color.R * alpha) + (oneminusalpha * background.R));
newG = ((color.G * alpha) + (oneminusalpha * background.G));
newB = ((color.B * alpha) + (oneminusalpha * background.B));
}
Tenga en cuenta que el color de entrada y el fondo tienen valores expresados en [0..255]
La ecuación de combinación estándar es:
out = alpha * new + (1 - alpha) * old
Donde out
, lo new
y lo old
son colores RGB, y alpha
es un número de punto flotante en el rango [0,1].
Entonces, tienes (para rojo):
240 = 0.1 * newR + 0.9 * 255
Resolviendo para newR
, obtenemos:
newR = (240 - 0.9 * 255) / 0.1
que evalúa a 105. Repita para los otros componentes, y listo.
Me pregunto por qué sabes su alfa y no su r, g, b ... A menos que el modo de fusión utilizado sea en todos los casos Normal, no podrás calcular el valor original. Y aunque todo sea ideal, solo podrá aproximarse, ya que probablemente ya se haya producido un redondeo al pasar del original al resultado. Además, lo más probable es que tenga que redondear al volver del resultado al original.
Si el modo de fusión es Normal, entonces no es demasiado difícil :-)
opacity*original + (1-opacity)*background = resulting pixel
original R = (resulting R - ((1-opacity)*background R)) / opacity.
original G = (resulting G - ((1-opacity)*background G)) / opacity.
original B = (resulting B - ((1-opacity)*background B)) / opacity.
en el que la opacidad es (alpha/100)
.