需要帮助将一个图像与另一个图像合并
本文关键字:图像 一个 另一个 合并 帮助 | 更新日期: 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#包装器。