如何在C#/ .NET中从另一个中减去一个位图?

我有两个位图,由不同的算法变体产生。 我想通过从另一个中减去一个来创建第三个位图来显示差异。

怎么能在.NET中完成? 我查看了Graphics类及其所有选项,包括ImageAttributes类,我有一个预感它涉及颜色矩阵或重映射表function。

有没有人有一些示例代码的链接,或者可以指向正确的方向? 谷歌搜索没有透露太多,除非我的谷歌今天失败了。

真正的问题是,你想表现出什么样的差异? 如果您只需要操作RGB颜色值,我认为最好的方法是只扫描两个位图并使用GetPixel比较颜色值,并使用SetPixel生成“差异”位图。 也许您只想减去这些值并将其用作第三个位图的新Color值。 或许你想要计算出光度并使用它。 更好的是,如果您有三个用于比较的指标,请将每个指标分配给颜色的RG和B组件。 我以前用这种方法进行分形着色。

还有其他方法,但有了这个方法,你只能受到想象力的限制。 它可能不是最快的方法,但听起来并不像这种情况需要性能。

看看这个项目。 它是Andrew Kirillov制造的运动探测器。 他实现了几个滤镜来获取两张图片之间的差异,并使用它来计算运动。 它非常好用,并且易于在您自己的应用程序中进行修改和使用。

http://www.codeproject.com/KB/audio-video/Motion_Detection.aspx

这可以通过PInvoking BitBlt API函数来完成。 以下是一些示例代码:

http://www.codeproject.com/KB/GDI-plus/Bitblt_wrapper_class.aspx

该示例使用SRCCOPY栅格操作码; 要获得两个位图之间的差异,您需要使用SRCPAINT或其他东西(GOOGLE应该提供代码列表)。

GetPixel和SetPixel(在Bitmap类上)速度令人难以置信。 使用LockBits会快得多,但你仍然需要编写自己的代码。

更新:这是一个更好的链接:

http://www.pinvoke.net/default.aspx/gdi32.BitBlt

并包括所有可能的三元光栅操作(SRCPAINT或SRCAND可能是您正在寻找的。)。

首先,定义减法;-p您希望答案看起来像什么?

执行此操作的最佳性能方法可能是LockBits – 它应该比许多GetPixel调用快得多,但您需要自己解码字节。 如果它只是像32bpp ARGB那样容易,但对于一些更复杂的情况却很棘手。

我在某处读过, Adobe Pixel Bender中使用的语言的灵感来自微软曾经做过的事情。 不记得我在哪里读它。 我的想法是,也许微软的“东西”被包装成.Net项目可以使用的东西。 无论如何,仅仅减去两个图像就有些过度杀伤。