2012-08-17 17 views
9

Mögliche Duplizieren:
How to do alpha blend fast?Alpha Blending 2 RGBA Farben in C

Was ist der schnellste Weg, um Alpha-Blending-2 RGBA (Integer) Farben?

Als eine Anmerkung ist die Zielfarbe, wo die Mischung ist immer undurchsichtig, nur die zweite Farbe kann verschiedene Transparenzstufen haben.

Ich versuche, die schnellste Art und Weise in C, unter Berücksichtigung zu finden, dass die endgültige resultierende Farbe aus der Mischung ohne Transparenz am Ende muss vollständig undurchsichtig (alpha = 0xff)

+0

Dieser Link hilft nicht – PerracoLabs

+0

Können Sie uns helfen, den Unterschied zwischen Ihrer Frage und diesem zu verstehen? Es scheint, dass einige von uns verwirrt sind. – sblom

+2

Kein Duplikat. Dies fragt nach Alpha-Blending in reinem alten 'C'. Die vermeintliche Frage, die dupliziert, stellt eine ähnliche Frage, aber in Bezug auf 'C++'. Zwei ähnliche, aber sehr unterschiedliche Sprachen. –

Antwort

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‘ Ich weiß, wie schnell es ist, aber es ist alles ganzzahlig. Es funktioniert, indem man Alpha (und inv_alpha) in 8,8 Festpunktdarstellungen umwandelt. Machen Sie sich keine Sorgen darüber, dass der Mindestwert von alpha 1 ist. In diesem Fall war fg [3] 0, was bedeutet, dass der Vordergrund transparent ist. Die Mischungen werden 1 * fg + 256 * bg sein, was bedeutet, dass alle Bits von fg aus dem Ergebnis herausgeschoben werden.

Sie könnten es sehr schnell tun, in der Tat, wenn Sie Ihre RGBAs in 64-Bit-Ganzzahlen gepackt haben. Sie könnten dann alle drei Ergebnisfarben parallel mit einem einzelnen Ausdruck berechnen.

+1

Funktioniert einfach perfekt und ziemlich schnell. – PerracoLabs

+2

Froh, es zu hören - nicht schlecht für ungeprüften Code, während um 2 Uhr morgens verschwendet? =] – Sniggerfardimungus

+1

+1 Ich habe mir den Kopf zerbrochen, wie Alpha-Blending für den größten Teil des heutigen Tages funktioniert. Dein Algorithmus ist der erste, den ich getestet habe. –