2012-08-17 12 views
9

Eventuali duplicati:
How to do alpha blend fast?alpha blending colori 2 RGBA in C

Qual è il modo più veloce per alpha blend 2 RGBA colori (intero)?

Come nota, il colore di destinazione in cui miscelare è sempre opaco, solo il secondo colore può avere diversi livelli di trasparenza.

Sto cercando di trovare il modo più veloce in C, tenendo conto che il colore risultante finale dalla miscela deve finire senza alcuna trasparenza, completamente opaco (alfa = 0xFF)

+0

Questo collegamento non aiuta – PerracoLabs

+0

Puoi aiutarci a capire la differenza tra la tua domanda e quella? Sembra che molti di noi siano confusi. – sblom

+2

Non un duplicato. Questo chiede di miscelare alfa nella semplice vecchia 'C'. La presunta domanda che duplica pone una domanda simile, ma riguardo a 'C++'. Due lingue simili, ma molto diverse. –

risposta

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' Sappiamo quanto è veloce, ma è tutto intero. Funziona girando alpha (e inv_alpha) in rappresentazioni 8.8 in virgola fissa. Non preoccuparti del fatto che il valore minimo di alfa è 1. In questo caso, fg [3] era 0, il che significa che il primo piano è trasparente. Le miscele saranno 1 * fg + 256 * bg, il che significa che tutti i bit di fg saranno spostati fuori dal risultato.

Si potrebbe fare molto velocemente, in effetti, se avete impacchettato i vostri RGBA in interi a 64 bit. È quindi possibile calcolare tutti e tre i colori dei risultati in parallelo con una singola espressione.

+1

Funziona semplicemente perfetto, e piuttosto veloce davvero. – PerracoLabs

+2

Felice di sentirlo - non male per codice non testato, mentre sprecato alle 2 del mattino? =] – Sniggerfardimungus

+1

+1 Mi stavo rompendo il cervello su come ottenere il mix alfa per funzionare per la parte migliore di oggi. Il tuo algoritmo è il primo che ho provato che in realtà ... beh, funziona. –

Problemi correlati