2012-12-21 28 views
7

在Windows Forms中使用GDI +,我希望能夠使用筆進行繪製並根據目標像素顏色進行混合。例如,如果我繪製一條線並穿過黑色像素,我希望它是較淺的顏色(例如像白色),以便它可見。當同一條線穿過白色像素時,它應該是較深的顏色(例如黑色),以便它仍然清晰可見。使用GDI +進行高級色彩混合+

有沒有辦法用GDI +做到這一點?

+0

這將會是難。您可以使用ImageAttributes創建一個TextureBrush,該ImageAttributes使用特製的ColorMatrix來獲得此效果。選擇不會產生不良色彩偏移的ColorMatrix會非常棘手。 –

+0

@Hans:我使用ColorMatrix工作,但我不知道我可以用什麼樣的ColorMatrix來做我想做的事。 ColorMatrix不是隻是插入我用畫筆繪製的圖像中的顏色?我需要根據已經用Graphics上下文繪製的背景圖像插補顏色。 –

回答

3

正如Hans Passant所建議的那樣,您可以使用畫布中當前的內容作爲紋理畫筆的圖像(可能需要雙緩衝才能正常工作),並使用ColorMatrix修改畫布上的顏色。

有一個顏色矩陣可以反轉類似於XOR的顏色,問題在於它不適用於中間灰色。該反轉RGB和葉阿爾法完整的彩色矩陣將是:

-1, 0, 0, 0, 0 
0,-1, 0, 0, 0 
0, 0,-1, 0, 0 
0, 0, 0, 1, 0 
1, 1, 1, 0, 1 

類似的東西,雖然慢。將畫布複製到的圖像和處理每像素的圖像的像素的規則,如果顏色是亮如比0.5,使其稍暗,使其稍微更亮。然後,您將該處理後的圖像作爲紋理筆刷進行繪製。這會給出更好的結果,但它會比使用ColorMatrix慢得多。

+0

所以你說要畫我的場景到一個圖像緩衝區,然後用一個TextureBrush的圖像作爲畫筆用於繪製我想要的線條。然後在畫筆上使用ColorMatrix來反轉顏色。但是如果中間灰色附近有任何顏色,它們將不可見? –

+0

準確地說。或者你可以嘗試第二種解決方案,但速度較慢,但​​可以提供更多控制。 – Coincoin

1

你可以嘗試XORing筆的顏色。 Paint.NET通過選擇邊框完成此操作,使其可以以任何顏色顯示。

+0

你知道他們是如何完成這個的嗎?我實際上有一個老版本的Paint.NET的源代碼,它的做法與新版本不一樣。我使用的代碼使用了兩支筆,一支白色和一支黑色筆,並使用具有不同偏移的相同短劃線模式繪製它們以創建交替的短劃線顏色。 –

+0

對不起,不知道。在他們的博客中,他們稱之爲上下文相關的XOR點畫模式。 –

0

哦,我不認爲這太難。您可以創建一個筆,根據它自己的位置自動更改顏色。只需讀取筆位置的像素(參見示例),獲取Alpha組件,並將筆的顏色設置爲黑色或白色(如果它分別大於或小於255/2):