17

Estoy intentando hacer una operación de fusión alfa de una imagen RGBA (imagen de primer plano), en una imagen RGB (imagen de fondo). Sin embargo, al hacerlo, creo que puedo estar haciendo una operación incorrecta de fusión alfa o hacerlo mal. Por ejemplo, el píxel de mi imagen RGB es de un color grisáceo (127, 127, 127). El píxel de mi imagen RGBA para el píxel será (0, 0, 255). Después de hacer mi operación de mezcla, el color final será (127, 0, 255). Sin embargo, pensé que era más una mezcla aditiva y diferente que la operación que estoy haciendo.Mezcla alfa manual de un píxel RGBA con un píxel RGB

Por cómo se fijan mis valores, echar un vistazo a este

incPixelColor[0] = 0; (red) 
incPixelColor[1] = 0; (green) 
incPixelColor[2] = 255; (blue) 
incPixelColor[3] = 255; (alpha) 

currentPixelColor[0] = 127; (red) 
currentPixelColor[1] = 127; (green) 
currentPixelColor[2] = 127; (blue) 

Por qué se establece mis cálculos, echar un vistazo a este

float incAlpha = (currentPixelColor[3]/255.0f); 

float red = ((float)incPixelColor[0]/255.0f * incAlpha) + ((float)currentPixelColor[0]/255.0f); 
float green = ((float)incPixelColor[1]/255.0f * incAlpha) + ((float)currentPixelColor[1]/255.0f); 
float blue = ((float)incPixelColor[2]/255.0f * incAlpha) + ((float)currentPixelColor[2]/255.0f); 


currentPixelColor[0] = min(red * 255, 255.0f); 
currentPixelColor[1] = min(green * 255, 255.0f); 
currentPixelColor[2] = min(blue * 255, 255.0f); 

Para los píxeles sin alfa, lo haría me gusta que el valor sea (0, 0, 255) para las imágenes con alfa. Me gustaría que se fundiera. Al final de la operación anterior, será (127, 127, 255). ¿Debo verificar si hay alfa para cada píxel, y si es así, hacer la mezcla o hay otra forma de hacerlo?

+0

que estás haciendo aditivo de mezcla. Considere la mezcla lineal de esta manera: y = (x0 * w) + (x1 * (1-w)) –

+1

Eso es una gran cantidad de 255 escalas hacia adelante y hacia atrás. No debería ser necesario si sus operaciones mantienen la normalización. – fche

Respuesta

22

Un típico "Over" mezcla se realiza de la siguiente manera:

outputRed = (foregroundRed * foregroundAlpha) + (backgroundRed * (1.0 - foregroundAlpha)); 

Y luego repetir para los canales azul y verde. Haz esto por cada píxel.

+0

Quizás estoy equivocado, pero ¿no es eso lo que ya estoy haciendo? – mmurphy

+0

No, lo que está haciendo es outputRed = (foreRed * foreAlpha) + backgroundRed. Necesitas multiplicar el backgroundRed por el (1.0 - foreAlpha). – user1118321

+0

Disculpe que tan tarde, pero ¿qué ocurre con el canal alfa de salida alfa si los píxeles de origen y de destino son transparentes? –

2

Parece que ha perdido (1-alfa) multiplicador para el fondo (currentPixelColor)

Cuestiones relacionadas