2012-08-17 27 views
9

Duplicar posibles:
How to do alpha blend fast?mezcla alfa 2 colores RGBA en C

¿Cuál es la manera más rápida de colores alfa RGBA mezcla de 2 (entero)?

Como nota, el color de destino donde mezclar es siempre opaco, solo el segundo color puede tener diferentes niveles de transparencia.

Estoy tratando de encontrar el camino más rápido en C, teniendo en cuenta que el color final resultante de la mezcla debe terminar sin transparencia, totalmente opaco (alfa = 0xFF)

+0

Este enlace no ayuda – PerracoLabs

+0

¿Puede ayudarnos a entender la diferencia entre su pregunta y esa? Parece que muchos de nosotros estamos confundidos. – sblom

+2

No es un duplicado. Esto pregunta acerca de la mezcla alfa en simple antigua 'C'. La supuesta pregunta que este duplica hace una pregunta similar, pero con respecto a 'C++'. Dos idiomas similares, pero muy diferentes. –

Respuesta

13
int blend(unsigned char result[4], unsigned char fg[4], unsigned char bg[4]) 
{ 
    unsigned int alpha = fg[3] + 1; 
    unsigned int inv_alpha = 256 - fg[3]; 
    result[0] = (unsigned char)((alpha * fg[0] + inv_alpha * bg[0]) >> 8); 
    result[1] = (unsigned char)((alpha * fg[1] + inv_alpha * bg[1]) >> 8); 
    result[2] = (unsigned char)((alpha * fg[2] + inv_alpha * bg[2]) >> 8); 
    result[3] = 0xff; 
} 

I don' Saber qué tan rápido es, pero todo es un número entero. Funciona al convertir alfa (e inv_alpha) en 8.8 representaciones de punto fijo. No se preocupe por el hecho de que el valor mínimo de alfa es 1. En ese caso, fg [3] era 0, lo que significa que el primer plano es transparente. Las mezclas serán 1 * fg + 256 * bg, lo que significa que todos los bits de fg se desplazarán fuera del resultado.

Podría hacerlo muy rápido, de hecho, si empacó sus RGBA en enteros de 64 bits. Luego puede calcular los tres colores de resultados en paralelo con una sola expresión.

+1

Funciona simplemente perfecto, y bastante rápido de hecho. – PerracoLabs

+2

Me alegro de escucharlo, no está mal para el código no probado, mientras se desperdicia a las 2 a.m. =] – Sniggerfardimungus

+1

+1 Me he estado revolviendo el cerebro acerca de cómo hacer que la mezcla alfa funcione durante la mayor parte del día. Tu algoritmo es el primero que probé, de hecho ... bueno, funciona. –

Cuestiones relacionadas