gpt4 book ai didi

c# - 如何叠加两个图像(作为字节数组)

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:06:54 26 4
gpt4 key购买 nike

各位,我相信这很容易,但谷歌没有帮助...

这是任务 - 我有两个字节数组(如 ARGB),代表我的图像。它们具有相同的尺寸。我应该执行什么操作(逐字节)将一张图像叠加到另一张图像上?第二张图片有一些透明度,必须加以考虑。

为了清楚起见,我正在寻找这样的代码:

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

简单的猜测,如按位或(我知道 - 这很愚蠢;))不起作用。

感谢您的回答。

编辑:由于安全问题,我不能使用标准库(所有这些奇怪的操作都发生在 Silverlight 上)。

最佳答案

假设您实际上正在使用位图,您可能会发现让库为您做这件事会更容易。

System.Drawing.Graphics 类有一个 CompositingMode 属性,可以设置为 SourceCopy(默认 - 覆盖背景颜色) 或 SourceOver(与背景颜色混合)。

参见 MSDN: How to Use Compositing Mode to Control Alpha Blending了解更多详情。

如果您只想要原始数学,alpha 混合非常简单。对于介于 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com