1

假设我以编程方式在两个图像之间进行比较。提取两个图像之间的差异后,假设我将差异存储在另一个名为bmp3的位图变量中

我从另一个站点获得了一个代码,该代码显示了如何将差异与第一张图像合并。

假设我有两个名为 bmp1 和 bmp2 的位图变量。我以编程方式提取名为bmp1 和 bmp2的两个变量之间的差异,并将其存储在bmp3变量中。

现在我想将差异与 bmp1 变量合并在同一位置。因此,我从一个站点获得了代码,并且运行良好,但是我对该代码的几行感到困惑。

这是代码:

Bitmap bComb = new Bitmap(bmp3.Width, bmp3.Height);

using (Graphics g = Graphics.FromImage(bComb))
{
    g.DrawImage(this.pictureBox1.Image, 0, 0, bComb.Width, bComb.Height);
    g.DrawImage(bmp3, 0, 0, bComb.Width, bComb.Height);
}

this.pictureBox4.Image = bComb;

这条线的意思是

Bitmap bComb = new Bitmap(bmp3.Width, bmp3.Height);

bcom 是新变量,它的大小与 bmp3 相同......我说的对吗?

这一行的含义 g.DrawImage(this.pictureBox1.Image, 0, 0, bComb.Width, bComb.Height); ?

我们正在将 picbox1 内容从 0,0 坐标写入 bcom 变量……对吗?

我们再次将 bmp3 内容从 0,0 坐标写入 bcom 变量....我说得对吗?

最后一行让我感到困惑。为什么我们再次将 bmp3 变量内容从 0,0 坐标写入 bcom 变量....对吗?

如果我们再次从 0,0 坐标写入 bcom 变量,那么 pic 应该彼此重叠,但输出正确。这是怎么可能的。

我需要你的帮助来理解这几行。所以请详细讨论这些线以及为什么总是使用 0,0 坐标。请帮助我理解代码。谢谢

4

2 回答 2

3

1. bComb is new variable which will have same size of bmp3 ....... am i right ?

是的,它是一个位图bmp3,我们将用它的大小在上面绘制一些其他东西,但现在它只包含空像素,仅此而已!

2.

using (Graphics g = Graphics.FromImage(bComb))

这条线使我们能够在其上绘制我们需要的任何东西bComb,可以是位图或矩形或简单的任何东西!

3.

g.DrawImage(this.pictureBox1.Image, 0, 0, bComb.Width, bComb.Height);

在这里,它将从点绘制this.pictureBox1.Image到位图(bComb),(0,0)该点(bComb.Width,bComb.Height)确实包含整个位图

4.

g.DrawImage(bmp3, 0, 0, bComb.Width, bComb.Height);

bmp3从点到点又被吸引到bComb这里(0,0)(bComb.Width,bComb.Height)

位图是从同一点以相同大小相互绘制的,关键是它们是否包含透明像素,结果将是这些位图的组合,否则您只会看到bmp3稍后绘制的并且没有任何线索第一个图像,我们使用 (0,0) 因为它是位图的起点,我们可以使用任何其他点来绘制我们的东西,但是这样我们会留下一些像素,那我们为什么要这样做呢?:)

  • 更新:完全有可能在彼此上绘制图像,如果它们具有透明像素,那么结果将像 marge 一样,但正如您所提到的,如果最后一个位图不包含任何透明像素,那么我们要唯一的图片看到是最后一个,我们将无法看到以前的位图,因为这些像素被最后一个位图覆盖了随意使用一些 png 半透明图像并将它们相互叠加并查看结果,恐怕我不知道任何用于图像比较的内置 gdi+ 函数,但您可以通过GetPixel()gdi+ 中的函数轻松完成,并将每个像素从一个位图与另一个位图进行比较,或者您可能使用不安全的代码并访问内存直接它完全取决于你,但如果你想要一个干净和简单的方法去GetPixel()!你也可以看看英特尔的open-cv图像处理库,希望对你有帮助
于 2013-05-15T14:45:21.710 回答
3

Bitmap bComb = new Bitmap(bmp3.Width, bmp3.Height); 在这里,我们创建一个与 bm3 大小相同的空图像 (bComb)。

using (Graphics g = Graphics.FromImage(bComb)) 这将创建一个新图形,它将使用空图像 bComb。任何用图形绘制的东西,都将直接应用到 bComb 上。

g.DrawImage(this.pictureBox1.Image, 0, 0, bComb.Width, bComb.Height); 这会将图片从图片框绘制到 bComb 上,并拉伸它以匹配图像大小。

g.DrawImage(bmp3, 0, 0, bComb.Width, bComb.Height);这会将 bm3 绘制到 bComb 上,位于我们之前绘制的图片框图像之上。这看起来像什么,取决于该图像是否具有透明度。假设我们看起来是正确的,这可能意味着 bm3 有一个 alpha 值(透明度),因此它将作为前一张图像的一种过滤器,结果似乎是两者的合并。

编辑:此外,您可能想查看一些库:Accord.Net(这是Aforge.Net的扩展。这两者的组合几乎涵盖了您需要的任何图像过滤器、比较或效果。另一个不错的是EMGU CV这是另一个答案中提到的 OpenCV 库的 C# 包装器。

于 2013-05-15T14:46:15.277 回答