繁体   English   中英

在Windows中执行全屏抓取

[英]Performing full screen grab in windows

我正在研究一个想法,涉及对屏幕(包括窗口和应用程序)进行完整捕获,对其进行分析,然后将项目作为覆盖叠加到屏幕上。

我想学习图像处理技术,如果我可以直接访问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之间,这不能用两个因素来解释。减少位深度。 与我使用CreateCompatibleBitmap (6-7ms / f)进行设置相比,在16位模式下使用CreateDIBSection (如上所述)可以显着提高速度。

有人知道为什么降至16bit会导致速度如此之快吗? 我是否有希望以这种速度抓取32bit? 如果不是为了色彩深度,则是为了不强制更改屏幕缓冲模式和可怕的闪烁。

我解决了有关切换到16位彩色模式的惊人速度的最初问题。 事实证明,这导致了Aero主题被禁用,这占了大部分。 Aero在32bit上关闭时,速度差不多。

链接到其他主题,获得一个很好的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM