需要帮助将一个图像与另一个图像合并

时间:2013-05-15 14:29:39

标签: c# gdi image-comparison

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

的Bitmap变量中

我从另一个网站获得了一个代码,展示了如何将差异与第一张图片合并。

假设我有两个名为bmp1&的Bitmap变量。 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); ?

我们正在从0,0坐标向bcom变量编写picbox1内容....我是对的吗?

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

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

如果我们将0,0坐标再次写入bcom变量,那么pic应该相互重叠,但输出正确。怎么可能。

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

2 个答案:

答案 0 :(得分: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 +函数用于图像比较,但您可以通过gdi +中的GetPixel()函数轻松完成并比较每个从一个位图到另一个位图的像素,或者您可能会使用不安全的代码并直接访问内存,这完全取决于您,但如果您想要一个干净简单的方法,请使用GetPixel()!您也可以查看英特尔的open-cv库进行图像处理,希望有所帮助

答案 1 :(得分:3)

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

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

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

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

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