¿Cómo calcular un color RGB especificando una cantidad de mezcla alfa?

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?

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) .

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]

    Intereting Posts