2010-05-14 86 views
4

我正在研究一個想法,涉及獲取包括窗口和應用程序在內的屏幕的完整捕捉,分析它,然後將項目作爲覆蓋物重新繪製到屏幕上。在窗口中執行全屏抓取

我想學習圖像處理技術,如果可以直接訪問Windows屏幕,我可以獲得大量數據。我可以使用它來構建自動化工具,這些工具以前從未見過。稍後更多。

我有大部分的全屏幕捕捉工作。

HWND hwind = GetDesktopWindow(); 
HDC hdc = GetDC(hwind); 

int resx = GetSystemMetrics(SM_CXSCREEN); 
int resy = GetSystemMetrics(SM_CYSCREEN); 
int BitsPerPixel = GetDeviceCaps(hdc,BITSPIXEL); 
HDC hdc2 = CreateCompatibleDC(hdc); 

BITMAPINFO info; 
info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
info.bmiHeader.biWidth = resx; 
info.bmiHeader.biHeight = resy; 
info.bmiHeader.biPlanes = 1; 
info.bmiHeader.biBitCount = BitsPerPixel; 
info.bmiHeader.biCompression = BI_RGB; 

void *data; 
hbitmap = CreateDIBSection(hdc2,&info,DIB_RGB_COLORS,(void**)&data,0,0); 
SelectObject(hdc2,hbitmap); 

一旦做到這一點,我可以反覆調用此:

BitBlt(hdc2,0,0,resx,resy,hdc,0,0,SRCCOPY); 

清理代碼(我不知道這是否是正確的):

DeleteObject(hbitmap); 
ReleaseDC(hwind,hdc); 
if (hdc2) { 
    DeleteDC(hdc2); 
} 

每次BitBlt的是稱它抓住屏幕並將其保存在內存中我可以通過data訪問。

性能有些令人滿意。 BitBlt在1920x1200x32下執行50毫秒(有時低至33ms)。

我感到驚訝的是,當我通過事先的圖形設置或通過使用ChangeDisplaySettings將顯示模式切換到16位,1920x1200x16時,我獲得了1ms和2ms之間大幅提高的屏幕截圖時間,這不能用比特深度減少兩個因素。使用CreateDIBSection(如上所述)在16位模式下提供了顯着的加速,相比之下,如果我使用CreateCompatibleBitmap(6-7ms/f)進行設置。

有人知道爲什麼降到16位導致這樣的速度增加?我有沒有希望以這樣的速度搶到32位?如果不是顏色深度,但不強制改變屏幕緩衝模式和可怕的閃爍。

回答

2

我解決了我原來關於切換到16位彩色模式的難以置信的加速問題。事實證明,這導致了Aero主題被禁用,其中大部分是佔據的。隨着32位Aero的關閉速度一樣快。

Link以其他主題與一個很好的答案。

+0

是啊爲什麼航空降到15 fps我不知道... – rogerdpack 2012-04-30 13:01:03