6

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

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

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

4

5 回答 5

7

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

还有其他方法,但是使用这种方法,您只能发挥自己的想象力。这可能不是最快的方法,但在这种情况下听起来并不需要性能。

于 2008-12-29T14:11:30.160 回答
3

看看这个项目。它是安德鲁·基里洛夫制造的运动检测器。他实现了几个过滤器来获取两张图片之间的差异,并使用它来计算运动。它做得非常好,并且很容易在您自己的应用程序中修改和使用。

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

于 2008-12-29T14:12:45.913 回答
2

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

于 2008-12-29T15:22:42.247 回答
1

首先,定义减法;-p 您希望答案是什么样的?

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

于 2008-12-29T14:14:24.240 回答
0

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

于 2008-12-29T14:18:48.880 回答