各位,我相信这很简单,但谷歌没有帮助…
这是任务-我有两个字节数组(作为ARGB),表示我的图像他们有同样的尺寸。
我应该执行什么操作(逐字节)将一个图像覆盖到另一个图像?
第二张图片有一些透明度,这是必须考虑的。
要清除,我正在寻找这样的代码:

          bytes[] result = new bytes[first.Length];
          for(i = 0; i< first.Lenght;i++)
          {
               result[i] = first[i] !!%SOMETHING%!! second[i];
          }

简单的猜测,如按位或(我知道-那很愚蠢;)不起作用。
谢谢你的回答。
编辑:由于安全问题,我不能使用standart库(所有这些奇怪的操作都发生在silverlight上)。

最佳答案

假设您实际上正在使用位图,那么您可能会发现让库为您这样做更容易。
System.Drawing.Graphics类有一个CompositingMode属性,可以设置为SourceCopy(默认值-覆盖背景色)或SourceOver(与背景色混合)。
详见MSDN: How to Use Compositing Mode to Control Alpha Blending
如果你只是想要原始的数学,阿尔法混合是非常简单的。对于介于0.0和1.0之间的alpha值a,结果应为:

(aOld * oldValue) + ((1 - aOld) * aNew * newValue)

其中oldValue是覆盖之前的值,newValue是要覆盖的值,aOldaNew分别是旧的和新的alpha值。显然,您需要分别对r、g和b值进行此计算。
另请参见:Alpha Compositing(wiki链接)了解更详细的解释。
更新:我认为应该很容易找出如何使其适应op中的代码,但我想不是每个人都是数学人。
我假设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;
}

关于c# - 如何叠加两个图像(作为字节数组),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2212049/

10-09 07:13
查看更多