2013-05-15 66 views
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); 

工商管理学士学位是新的变量,这将有BMP3的相同尺寸.......我说的对?

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

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

再次,我们正在写bmp3内容到bcom变量从0,0坐标再次....我是对吗?

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

如果我们再次从0,0坐标写入到bcom变量,那么图片应该彼此重叠,但输出是正确的。它如何成为可能。

我需要你的帮助来理解那些情侣。所以请详细讨论这些线,为什么总是使用0,0坐标。请帮我理解代码。由于

回答

3

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从点(0,0)位图(bComb),以(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库进行图像处理,希望它可以帮助
+0

很好地解释了,但是点3,4并不清楚,很明显,代码在bcom变量上绘制图像,第一次从0,0坐标清晰,但下一行再次从0,0绘制图像?如果我们在另一幅图像上绘制一幅图像,则应该隐藏第一幅图像,但在我的情况下,输出结果是正确的。 – Mou

+0

我猜image1和diff图像有相同的宽度,diff图像有很多透明像素。如果是这种情况,那么可以一个接一个地写入两个图像,并将图像合并为第一图像。我对吗 ? – Mou

+0

点有任何内置的gdi函数可以告诉我两个图像是否相同?也应该是第一个足够的例程。 plzz指南。 – Mou

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上,在我们之前绘制的picturebox图像的顶部。这看起来像什么,取决于该图像是否具有透明度。假设它是我们看起来正确的,这可能意味着bm3具有alpha值(透明度),因此它将用作对先前图像的一种过滤器,导致似乎是两者合并的结果。

编辑:另外,一些库,你可能想看看:。Accord.Net(这是Aforge.Net的延伸这两个几乎涵盖了所有的图像过滤器,比较或者你需要的效果的结合,另一个好消息是EMGU CV这是在另一个答案中提到的OpenCV库的C#封装器

相关问题