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

本文关键字:图像 一个 另一个 合并 帮助 | 更新日期: 2023-09-27 18:13:49

假设我在程序上比较两个图像。在提取两个图像之间的差异后,假设我将差异存储在另一个名为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,b组合宽度,b组合高度(?

我们正在从0,0坐标向bcom变量写入picbox1内容。。。。我说得对吗?

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

最后一行让我很困惑。为什么我们再次从0,0坐标向bcom变量写入bmp3变量内容。。。。我说得对吗?

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

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

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

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);

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

4.

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

bmp3在这里从点(0,0)再次被绘制到bComb(bComb.Width,bComb.Height)

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

  • 更新:完全可以相互绘制图像,如果它们有透明像素,结果会像marge一样,但正如你所提到的,如果最后一个位图不包含任何透明像素,那么我们将看到的唯一图片是最后一个,我们将无法看到之前的位图,因为这些像素被最后一个点阵图覆盖了。请随意使用一些png半透明图像,并将它们绘制在一起,然后查看结果,恐怕,我不知道有任何内置的gdi+函数用于图像比较,但你可以通过gdi+中的GetPixel()函数轻松完成,并将一个位图中的每个像素与另一个位图进行比较,否则你可能会使用不安全的代码并直接访问内存,这完全取决于你,但如果你想用GetPixel()找到一种干净简单的方法!你也可以看看英特尔的开放式简历库,希望它能有所帮助

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);这会将图像从pictureBox绘制到bComb上,并将其拉伸以匹配图像大小。

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

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