2009-04-14 34 views
49

Estoy escribiendo un selector de color que obtiene los valores RGB de píxeles 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.¿Cómo calcular un color RGB especificando una cantidad de mezcla alfa?

Por ejemplo:

el color del píxel resultante es 240247249 pero sé que el color original tenía una opacidad del 10% y estaba en la parte superior de un (255,255,255) de fondo blanco. ¿Cuál es el cálculo para calcular los valores RGB originales?

Respuesta

80

La ecuación de mezcla estándar es:

out = alpha * new + (1 - alpha) * old 

Dónde out, new y old son los colores RGB, y alpha es un número de coma flotante en el intervalo [0,1].

tanto, usted tiene (para el 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 ya está .

+1

? ¿No es tu ecuación lo mismo que la mía? –

+0

Sí, las ecuaciones son las mismas, pero escritas de forma ligeramente diferente. – unwind

+2

¡Guau! ¡Me he tirado del pelo durante 2 horas tratando de aplicar ingeniería inversa a esta ecuación al comparar valores en photoshop! ¡Gracias por reducir mi pérdida de cabello! ¿Cómo encontraste o sacaste esta ecuación? – talentedmrjones

31

Me pregunto por qué conoces 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).

+0

Lo sentimos, debería haber mencionado que el modo de fusión era normal. Estaba escogiendo el color de una página web que tenía una imagen con un conjunto de opacidad, así que sabía que no era solo rgb. Gracias de cualquier manera. –

3

El siguiente pseudo-código resuelve su 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 backgroud tiene valores expresado en [0..255]

Cuestiones relacionadas