2010-05-14 2 views
4

Я работаю над идеей, которая включает в себя полный захват экрана, включая окна и приложения, анализ его, а затем рисование элементов обратно на экран в качестве наложения.Выполнение полноэкранного захвата в окнах

Я хочу научиться методам обработки изображений, и я могу получить много данных для работы, если я могу напрямую получить доступ к экрану 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 бит с такой скоростью? если не для глубины цвета, а для того, чтобы не заставлять менять режимы буфера экрана и ужасное мерцание.

ответ

2

Я решил свой первоначальный вопрос о невероятной скорости перехода на 16-битный цветной режим. Оказывается, это привело к отключению темы Aero, на которую приходится большая часть. С Aero в 32bit это примерно так же быстро.

Link в другую тему с хорошим ответом.

+0

да, почему аэро падает до 15 кадров в секунду. Я понятия не имею ... – rogerdpack

Смежные вопросы