Я работаю над идеей, которая включает в себя полный захват экрана, включая окна и приложения, анализ его, а затем рисование элементов обратно на экран в качестве наложения.Выполнение полноэкранного захвата в окнах
Я хочу научиться методам обработки изображений, и я могу получить много данных для работы, если я могу напрямую получить доступ к экрану 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 выполняется за 50 миллисекунд (иногда до 33 мс) с разрешением 1920x1200x32.
Что меня удивляет, так это то, что когда я переключаю режим отображения на 16 бит, 1920x1200x16, либо с помощью моих настроек графики заранее, либо используя ChangeDisplaySettings
, я получаю значительно улучшенное время захвата экрана между 1 мс и 2 мс, что не может быть объяснено коэффициент двух уменьшений в глубине бит. Использование CreateDIBSection
(как указано выше) обеспечивает значительную скорость в 16-битном режиме по сравнению с настройкой CreateCompatibleBitmap
(6-7 мс/ф).
Кто-нибудь знает, почему падение до 16 бит вызывает такое увеличение скорости? Есть ли надежда на то, что я могу захватить 32 бит с такой скоростью? если не для глубины цвета, а для того, чтобы не заставлять менять режимы буфера экрана и ужасное мерцание.
да, почему аэро падает до 15 кадров в секунду. Я понятия не имею ... – rogerdpack