假设你正在使用位图,那么你可能会发现让库来帮助你处理更容易。
System.Drawing.Graphics
类有一个CompositingMode
属性,可以设置为SourceCopy
(默认值-覆盖背景颜色)或SourceOver
(与背景颜色混合)。
详见MSDN:如何使用混合模式控制Alpha混合。
如果你只想要原始的数学公式,Alpha混合很简单。对于0.0到1.0之间的Alpha值a,结果应该为:
(aOld * oldValue) + ((1 - aOld) * aNew * newValue)
其中oldValue
是覆盖前的先前值,newValue
是您想进行覆盖的值,aOld
和aNew
分别是旧的和新的alpha值。显然,您需要分别对R、G和B值进行此计算。
另请参阅:Alpha Compositing(维基链接)以获取更详细的说明。
更新:我认为适应原始代码应该很容易,但我猜并不是每个人都精通数学。
我将假设
byte[]
是A,R,G,B值的重复序列(因此
Length
将是4的倍数)。 如果不是这种情况,则您必须根据自己使用的存储格式调整此代码。
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;
}