我正在研究一个想法,涉及全面捕获屏幕(包括窗口和应用程序),对其进行分析,然后将项目作为叠加层绘制回屏幕上。
我想学习图像处理技术,如果我可以直接访问 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 毫秒(有时低至 33 毫秒)。
令我惊讶的是,当我通过预先的图形设置或使用ChangeDisplaySettings
,我得到了 1 毫秒到 2 毫秒之间的屏幕抓取时间的大幅改善,这不能用位深度减少两倍来解释。使用CreateDIBSection
(如上所述)与我设置相比,在 16 位模式下提供了显着的加速CreateCompatibleBitmap
(6-7 毫秒/f)。
有谁知道为什么降到 16 位会导致速度如此提升?以这样的速度我还有希望抢到32位吗?如果不是因为颜色深度,而是因为不强制更改屏幕缓冲区模式和可怕的闪烁。