In der Annahme, dass Sie tatsächlich mit Bitmaps arbeiten, werden Sie es wahrscheinlich einfacher finden, die Bibliothek dies für Sie erledigen zu lassen.
En System.Drawing.Graphics
Klasse hat eine CompositingMode
Eigenschaft, die entweder auf eine der folgenden Eigenschaften gesetzt werden kann SourceCopy
(der Standard - überschreibt die Hintergrundfarbe) oder SourceOver
(mischt sich mit der Hintergrundfarbe).
Voir MSDN: Verwenden des Kompositionsmodus zur Steuerung der Alpha-Überblendung für weitere Einzelheiten.
Wenn Sie nur die reinen mathematischen Daten wollen, ist Alpha Blending ziemlich einfach. Für einen Alphawert a zwischen 0,0 und 1,0 liegt, sollte das Ergebnis lauten:
(aOld * oldValue) + ((1 - aOld) * aNew * newValue)
Wo oldValue
ist der vorherige Wert vor der Überlagerung, newValue
ist das, was Sie überlagern wollen, und aOld
y aNew
sind der alte bzw. der neue Alphawert. Natürlich müssen Sie diese Berechnung für die R-, G- und B-Werte getrennt durchführen.
Siehe auch: Alpha-Compositing (wiki link) für eine ausführlichere Erklärung.
Update: Ich denke, es sollte einfach sein, herauszufinden, wie man dies an den Code im OP anpassen kann, aber ich denke, nicht jeder ist ein Mathe-Mensch.
Ich gehe davon aus, dass die byte[]
ist eine sich wiederholende Folge von A-, R-, G- und B-Werten (also Length
wäre ein Vielfaches von 4). Wenn das nicht der Fall ist, müssen Sie diesen Code an das von Ihnen verwendete Speicherformat anpassen.
bytes[] result = new bytes[first.Length];
for(i = 0; i < first.Length; i += 4)
{
byte a1 = first[i];
byte a2 = second[i];
byte r1 = first[i+1];
byte r2 = second[i+1];
byte g1 = first[i+2];
byte g2 = second[i+2];
byte b1 = first[i+3];
byte b2 = second[i+3];
byte a = a1 + (255 - a1) * a2 / 255;
byte r = r1 * a1 / 255 + r2 * (255 - a1) * a2 / 65025;
byte g = g1 * a1 / 255 + g2 * (255 - a1) * a2 / 65025;
byte b = b1 * a1 / 255 + b2 * (255 - a1) * a2 / 65025;
result[i] = a;
result[i+1] = r;
result[i+2] = g;
result[i+3] = b;
}