我正在研究一个想法,涉及获取包括窗口和应用程序在内的屏幕的完整捕捉,分析它,然后将项目作为覆盖物重新绘制到屏幕上。在窗口中执行全屏抓取
我想学习图像处理技术,如果可以直接访问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