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

时间:2008-12-29 14:03:43

标签: c# .net image subtraction

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

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

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

5 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

查看这个项目。它是Andrew Kirillov制造的运动探测器。他实现了几个过滤器以获得两张图片之间的差异,并使用它来计算移动。它非常好用,很容易在你自己的应用程序中修改和使用。

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

答案 2 :(得分:2)

这可以通过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可能是您正在寻找的。)。

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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