我知道有在網絡上很多帖子做屏幕捕捉在Windows或者使用GDI或DirectX接近。但是,我發現的所有內容都將捕獲的圖像保存爲位圖,而我想將其保存到緩衝區中。這裏是我的代碼在GDI方式做到這一點:4K屏幕在Windows捕獲並直接保存到緩衝區中
HWND hwind = GetDesktopWindow();
HDC hdc = GetDC(hwind);
uint32_t resx = GetSystemMetrics(SM_CXSCREEN);
uint32_t resy = GetSystemMetrics(SM_CYSCREEN);
uint32_t 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;
static HBITMAP hbitmap = CreateDIBSection(hdc2, &info, DIB_RGB_COLORS,
(void**)&data, 0, 0);
SelectObject(hdc2, hbitmap);
BitBlt(hdc2, 0, 0, resx, resy, hdc, 0, 0, SRCCOPY);
uint8_t *ptr = new uint8_t[4 * resx * resy];
uint32_t lineSizeSrc = 4 * resx; // not always correct
uint32_t linesizeDst = 4 * resx;
for (uint32_t y = 0; y < resy; y++)
memcpy(ptr + y * lineSizeDst,
(uint8_t*) data + y * lineSizeSrc,
lineSizeDst);
DeleteObject(hbitmap);
ReleaseDC(hwind, hdc);
if (hdc2) {
DeleteDC(hdc2);
}
首先,據我所知,lineSizeSrc
在這段代碼的價值並不總是正確的,因爲這取決於屏幕分辨率,一些零可添加到每行data
。任何人都可以請解釋什麼時候添加零,以及如何獲得正確的值lineSizeSrc
?
其次,是否有可能迫使顯卡輸出4K分辨率來獲得拍攝圖像中的4K分辨率無論監視器的分辨率,例如?