Я искал чистый способ WIN32 для передачи данных изображения экрана в буфер, для анализа объектов на изображении позже … К сожалению, я не нашел ни одного. Теперь я открыт для предложений библиотек / классов, которые могут выполнять «печать экрана», но у меня все еще должен быть доступ к его буферу памяти.
Любая помощь приветствуется.
РЕДАКТИРОВАТЬ: я забыл упомянуть, что я буду снимать экран постоянно, поэтому скорость работы очень важна. Может кто знает хорошую библиотеку для этого?
Есть несколько способов (вы можете использовать DirectX), но, вероятно, самый простой и легкий — это использовать GDI.
// GetDC(0) will return screen device context
HDC hScreenDC = GetDC(0);
// Create compatible device context which will store the copied image
HDC hMyDC= CreateCompatibleDC(hScreenDC );
// Get screen properties
int iScreenWidth = GetSystemMetrics(SM_CXSCREEN);
int iScreenHeight = GetSystemMetrics(SM_CYSCREEN);
int iBpi= GetDeviceCaps(hScreenDC ,BITSPIXEL);
// Fill BITMAPINFO struct
BITMAPINFO info;
info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
info.bmiHeader.biWidth = iScreenWidth;
info.bmiHeader.biHeight = iScreenHeight ;
info.bmiHeader.biPlanes = 1;
info.bmiHeader.biBitCount = iBpi;
info.bmiHeader.biCompression = BI_RGB;
// Create bitmap, getting pointer to raw data (this is the important part)
void *data;
hBitmap = CreateDIBSection(hMyDC,&info,DIB_RGB_COLORS,(void**)&data,0,0);
// Select it into your DC
SelectObject(hMyDC,hBitmap);
// Copy image from screen
BitBlt(hMyDC, 0, 0, iScreenWidth, iScreenHeight, hScreenDC , 0, 0, SRCCOPY);
// Remember to eventually free resources, etc.
Прошло много времени с тех пор, как я это сделал, поэтому я могу что-то забыть, но в этом суть. Слово предупреждения: это НЕ быстро; когда экран много двигается, для захвата одного кадра может потребоваться 50 мс или более. Это в основном эквивалентно нажатию клавиши PrintScreen.
// get screen DC and memory DC to copy to
HDC hScreenDC = GetDC(0);
HDC hMemoryDC = CreateCompatibleDC(hScreenDC);
// create a DIB to hold the image
BITMAPINFO bmi = { 0 };
bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
bmi.bmiHeader.biWidth = GetDeviceCaps(hScreenDC, HORZRES);
bmi.bmiHeader.biHeight = -GetDeviceCaps(hScreenDC, VERTRES);
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
LPVOID pBits;
HBITMAP hBitmap = CreateDIBSection(hMemoryDC, &bmi, DIB_RGB_COLORS, &pBits, NULL, 0);
// select new bitmap into memory DC
HGDIOBJ hOldBitmap = SelectObject(hMemoryDC, hBitmap);
// copy from the screen to memory
BitBlt(hMemoryDC, 0, 0, bmi.bmiHeader.biWidth, -bmi.bmiHeader.biHeight, hScreenDC, 0, 0, SRCCOPY);
// clean up
SelectObject(hMemoryDC, hOldBitmap);
DeleteDC(hMemoryDC);
ReleaseDC(0, hScreenDC);
// the image data is now in pBits in 32-bpp format
// free this when finished using DeleteObject(hBitmap);