假设我以编程方式比较两个图像。在提取两个图像之间的差异后,假设我将差异存储在另一个名为 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坐标。请帮我理解代码。感谢
答案 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),因为它是我们的位图的起点,我们可以使用任何其他点来绘制我们的东西,但这样我们留下一些像素,所以为什么我们会吗? :)
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#包装器。