2008-12-29 58 views
6

我有兩個位圖,由算法的不同變體產生。我想通過從另一箇中減去一個來創建第三個位圖來顯示差異。如何從C#/ .NET中的另一個位圖中減去一個位圖?

這怎麼能在.NET中完成?我查看過Graphics類及其所有選項,包括ImageAttributes類,並且我有一個預感,它涉及顏色矩陣或重新映射表的功能。

有沒有人有一個示例代碼的鏈接,或者可以指向正確的方向?谷歌搜索不會透露很多,除非我的谷歌搜索今天失敗了。

回答

7

真正的問題是,你想表現出什麼樣的差異?如果您只需要對RGB顏色值進行操作,則我認爲最好的方法是隻掃描兩個位圖並使用GetPixel比較顏色值,並使用SetPixel生成「差異」位圖。也許你只是想減去這些值並將它們用作第三個位圖的新顏色值。或者你也許想計算出光度並使用它。更好的是,如果您有三個比較指標,請將每個指標分配給顏色的R G和B分量。我之前使用過這種方法進行分形着色。

還有其他的方法,但有了這個,你只限於你的想象力。這可能不是最快的方法,但聽起來不像這種情況下性能是必要的。

+0

你是對的,表現不是布拉格。這裏有1個目標,我越想到它,這聽起來就像我自己需要編寫代碼一樣。我最初想到的是一種魔術倒置image2-add-to-image1算法,但它會如何處理負面結果......好吧,回去工作然後:) – 2008-12-29 14:13:24

+0

如果你確實需要性能,請記住你可以使用Bitmap對象的LockBits方法來獲取可以操作的原始像素值的字節數組。趨於比GetPixel和SetPixel更快。 – driis 2008-12-29 14:41:56

1

首先,定義減去;-p你想要什麼答案是什麼樣子?

執行此操作的最佳性能方式可能是LockBits - 應該比調用大量的GetPixel更快,但您需要自行解碼字節。如果它只是像32bpp ARGB那樣容易,但對於一些更復雜的情況則很棘手。

0

我讀過的地方Adobe Pixel Bender中使用的語言是由微軟曾經做過的事情所啓發。不記得我讀的地方。我的想法是,也許微軟的「東西」被包裝成.Net項目可以使用的東西。矯枉過正只是減去兩張圖片,但無論如何。

2

這可以通過PInvoking BitBlt API函數來完成。下面是一些示例代碼:

http://www.codeproject.com/KB/GDI-plus/Bitblt_wrapper_class.aspx

該示例使用SRCCOPY光柵操作碼;爲了獲得兩個位圖之間的差異,你應該使用SRCPAINT或其他東西(GOOGLE應該給出代碼列表)。

GetPixel和SetPixel(在位圖類上)速度令人難以置信。使用LockBits會快得多,但您仍然需要編寫自己的代碼。

更新:這是一個更好的鏈接:

http://www.pinvoke.net/default.aspx/gdi32.BitBlt

,包括所有可能的三元光柵操作(SRCPAINT或SRCAND可能是你在找什麼。)。

相關問題