2013-05-15 69 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#封裝器

相關問題