2010-09-17 122 views
0

我想在屏幕的特定區域上創建一個過濾器來執行過濾操作。屏幕顏色過濾

實例什麼過濾opertion可能是:
      - 反轉(例如,改變黑色像素爲白色像素,紅至藍綠色)
      - 掩蔽像素(例如掩模= FF0000;輸入c79001 - > c70000)
      - 操作,如Photoshop的圖層效果

這裏是它應該是什麼樣子的例子: http://img443.imageshack.us/img443/1462/overlayk.png

有誰知道如何在Windows操作系統下執行此操作。 (我喜歡的語言是C#)

謝謝!

+0

看起來很像xor過濾器。 – 2010-09-17 17:16:49

回答

0

根據您需要更新「過濾器」的速度,快速和黑客的方法是隻使用CopyFromScreen獲取屏幕截圖,而您的過濾器窗口不可見,將過濾器應用於圖像數據,然後設置過濾器窗口來顯示圖像數據。

如果你想這樣做,而不必首先隱藏窗口,你可能需要做一些像http://www.codeproject.com/KB/system/snapshot.aspx在那裏你可以捕捉到單個窗口。

一個更棘手但可能更快的事情要做,並且要求幾乎完全使用p/invoke win32調用,將根本沒有窗口,根據座標獲取所需的捕獲窗口,將圖像捕獲爲上面,然後直接畫到屏幕DC。

+0

我雖然關於這種方法。問題是,當濾鏡後面的像素髮生變化時,我需要更新濾鏡。但是由於過濾器在前面,我無法檢測它們是否發生了變化。 (暫時不能將過濾器設置爲不可見。) – raisyn 2010-09-17 17:30:51

+0

對,然後考慮第三個選項。基於直接窗口捕捉直接重複繪製到屏幕DC。 – Reinderien 2010-09-17 17:36:29

+0

你能解釋一下「直接窗口捕捉」是什麼嗎? – raisyn 2010-09-17 17:43:13

0

澄清:你想在桌面的面積,不只是你的窗口的範圍內,是你的控制,讓您應用逐像素過濾器下。如果是這樣的話,我認爲你需要的是使用XNA庫的DirectDraw。 WPF可以讓你得到你所需要的,但WinForms很可能不會。還有第三方工具。

如果希望只在您的應用程序窗口的界限這種能力,例如在繪圖應用程序,它變得更容易。從Control繼承的Windows.Forms名稱空間中的每個類都暴露了一個CreateGraphics()方法。此方法返回一個表示覆蓋控件屏幕區域的繪圖表面的對象,並且是幾乎任何您想在涉及自定義圖形的窗口上執行的任何操作的基礎(在內部,它用於首先繪製控件) 。

一旦你有圖形對象,你可以在上面畫圖。繪製動畫或遊戲等自定義圖形的常用方法是在Bitmap對象上進行實際繪製(從抽象圖像派生),然後完成後在圖形區域繪製位圖。這樣做是爲了減少閃爍;如果圖形區域在繪製時顯示給用戶,那麼用戶在「擦除」和重繪之前只能看到完整的圖像一秒鐘,並且半途畫出的形狀將在那裏一會兒並且消失接下來等待被繪製。繪製到位圖,然後在完成後在屏幕上顯示位圖,意味着用戶一次可看到完整的圖像。

您可以使用透明度功能擴展此功能以創建多層圖像。爲您希望操作的每個圖層都有一個位圖。分別對它們進行處理,然後按照它們從後到前的正確順序將它們中的每一個繪製到主位圖上,然後在屏幕上繪製該位圖。這允許您使用PhotoShop類型的操作,其中一部分圖像是一個圖層,並且可以獨立於其他圖層進行操作。

對於每像素過濾,Bitmap對象公開了GetPixel()和SetPixel()方法,這些方法允許您獲取單個像素的顏色,執行濾鏡計算並重新繪製它。這個過程將完全不加速,因此受到CPU速度的限制,但可以非常精細地控制圖像或重複執行任務,如過濾器。

+0

我想要一個區域或桌面,而不只是在你的窗口範圍內。任何想法如何用DirectDraw做到這一點? – raisyn 2010-09-17 17:44:23

+0

您需要VS的XNA Game Studio插件。它將允許訪問Microsoft.XNA.Framework命名空間。在Graphics子空間下,你會發現GraphicsAdapter,它有一些方法允許你引用一部分屏幕進行繪製,並設置對象來應用紋理(在這種情況下,你只需要一個與區域大小相同的面部你正在引用)。您將在user32和gdi32 DLL中將它與Windows API方法結合使用,以便您可以抓取屏幕區域,以便在重新繪製它們之前使用.NET代碼處理它們。 – KeithS 2010-09-17 18:05:11