我有兩個位圖,由算法的不同變體產生。我想通過從另一箇中減去一個來創建第三個位圖來顯示差異。如何從C#/ .NET中的另一個位圖中減去一個位圖?
這怎麼能在.NET中完成?我查看過Graphics類及其所有選項,包括ImageAttributes類,並且我有一個預感,它涉及顏色矩陣或重新映射表的功能。
有沒有人有一個示例代碼的鏈接,或者可以指向正確的方向?谷歌搜索不會透露很多,除非我的谷歌搜索今天失敗了。
我有兩個位圖,由算法的不同變體產生。我想通過從另一箇中減去一個來創建第三個位圖來顯示差異。如何從C#/ .NET中的另一個位圖中減去一個位圖?
這怎麼能在.NET中完成?我查看過Graphics類及其所有選項,包括ImageAttributes類,並且我有一個預感,它涉及顏色矩陣或重新映射表的功能。
有沒有人有一個示例代碼的鏈接,或者可以指向正確的方向?谷歌搜索不會透露很多,除非我的谷歌搜索今天失敗了。
真正的問題是,你想表現出什麼樣的差異?如果您只需要對RGB顏色值進行操作,則我認爲最好的方法是隻掃描兩個位圖並使用GetPixel比較顏色值,並使用SetPixel生成「差異」位圖。也許你只是想減去這些值並將它們用作第三個位圖的新顏色值。或者你也許想計算出光度並使用它。更好的是,如果您有三個比較指標,請將每個指標分配給顏色的R G和B分量。我之前使用過這種方法進行分形着色。
還有其他的方法,但有了這個,你只限於你的想象力。這可能不是最快的方法,但聽起來不像這種情況下性能是必要的。
看看這個項目。它是安德魯基裏洛夫製造的運動探測器。他實現了幾個過濾器來獲得兩張圖片之間的差異,並用它來計算運動。這是非常好的,它很容易修改和使用在你自己的應用程序。
http://www.codeproject.com/KB/audio-video/Motion_Detection.aspx
首先,定義減去;-p你想要什麼答案是什麼樣子?
執行此操作的最佳性能方式可能是LockBits
- 應該比調用大量的GetPixel
更快,但您需要自行解碼字節。如果它只是像32bpp ARGB那樣容易,但對於一些更復雜的情況則很棘手。
我讀過的地方Adobe Pixel Bender中使用的語言是由微軟曾經做過的事情所啓發。不記得我讀的地方。我的想法是,也許微軟的「東西」被包裝成.Net項目可以使用的東西。矯枉過正只是減去兩張圖片,但無論如何。
這可以通過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可能是你在找什麼。)。
你是對的,表現不是布拉格。這裏有1個目標,我越想到它,這聽起來就像我自己需要編寫代碼一樣。我最初想到的是一種魔術倒置image2-add-to-image1算法,但它會如何處理負面結果......好吧,回去工作然後:) – 2008-12-29 14:13:24
如果你確實需要性能,請記住你可以使用Bitmap對象的LockBits方法來獲取可以操作的原始像素值的字節數組。趨於比GetPixel和SetPixel更快。 – driis 2008-12-29 14:41:56