屏幕截图应该能够位于任何位置并且具有任何宽度/高度。
我想仅保存 screen_dc 中的 x,y - 宽度、高度,并将该数据存储在 mem_dc 中,从 0,0 - 宽度、高度开始。
我当前的代码:
std::vector<RGBQUAD> recvScreenSnippet(int x, int y, int width, int height) {
std::vector<RGBQUAD> v_screen_data;
HDC const screen_dc = GetDC(NULL);
HDC const mem_dc = CreateCompatibleDC(NULL);
HBITMAP const hBmp = CreateCompatibleBitmap(screen_dc, width, height);
auto const oldBmp = SelectObject(mem_dc, hBmp);
// 32 bit & Upside Down (Y-Flipped)
BITMAPINFO bmi{};
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biHeight = height;
bmi.bmiHeader.biWidth = width;
bmi.bmiHeader.biSize = sizeof(BITMAPINFO);
// Receive pixel data from hdc
BitBlt(mem_dc, 0, 0, width, height, screen_dc, x, y, SRCCOPY);
GetDIBits(mem_dc, hBmp, 0, height, &v_screen_data[0], &bmi, DIB_RGB_COLORS);
// Cleanup
SelectObject(mem_dc, oldBmp);
DeleteObject(hBmp);
DeleteDC(mem_dc);
ReleaseDC(0, screen_dc);
return v_screen_data;
}
这应该向下和向右移动 10 像素,然后从该位置创建宽度和高度均为 30 像素的屏幕截图。
std::vector<RGBQUAD> v_screen_snippet = recvScreenSnippet(10, 10, 30, 30);
我的问题是:我做得对吗,还是我对 BitBlt 的理解错误,因为我见过很多例子,其中偏移量已插入到第一个参数中,而不是最后一个参数中。
BitBlt(mem_dc, CONFUSING, CONFUSING, width, height, screen_dc, CONFUSING, CONFUSING, SRCCOPY);
我已阅读文档,但我仍然很困惑,我将不胜感激。
我尝试更改周围的参数,但仍然很困惑。