我正在研究一個想法,涉及獲取包括窗口和應用程序在內的屏幕的完整捕捉,分析它,然後將項目作爲覆蓋物重新繪製到屏幕上。在窗口中執行全屏抓取
我想學習圖像處理技術,如果可以直接訪問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位?如果不是顏色深度,但不強制改變屏幕緩衝模式和可怕的閃爍。
是啊爲什麼航空降到15 fps我不知道... – rogerdpack 2012-04-30 13:01:03