如何让 BitBlt 使用偏移量?

问题描述 投票:0回答:0

大家!

当 OFFSET VALUES 为 0 时,下面的代码工作得非常好,但是当 OFFSET VALUES 不为 0 时,屏幕截图数据就会变得混乱。

基本上我想从桌面上截取从 x:55,y:85 开始到 x:555,y:485 结束的屏幕截图,我需要更改什么才能使其正常工作?

// Offset values
const int SCREENSHOT_X_OFFSET = 55, SCREENSHOT_Y_OFFSET = 85;

// Prepare
const int BITMAP_WIDTH = 500, BITMAP_HEIGHT = 400;
const HDC hDc = GetDC(NULL);
const HDC hDcmem = CreateCompatibleDC(NULL);
const HBITMAP hBmp = CreateCompatibleBitmap(hDc, BITMAP_WIDTH, BITMAP_HEIGHT);
const auto oldBmp = SelectObject(hDcmem, hBmp);

// Set headers
BITMAPINFO bmi{};
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biHeight = BITMAP_HEIGHT;
bmi.bmiHeader.biWidth = BITMAP_WIDTH;
bmi.bmiHeader.biSize = sizeof(BITMAPINFO);

// Create screenshot in memory and transfer data to v_BitmapValues
std::vector<RGBQUAD> v_BitmapValues(BITMAP_WIDTH * BITMAP_HEIGHT);
BitBlt(hDcmem, 0, 0, BITMAP_WIDTH, BITMAP_HEIGHT, hDc, SCREENSHOT_X_OFFSET, SCREENSHOT_Y_OFFSET, SRCCOPY);
GetDIBits(hDcmem, hBmp, 0, BITMAP_HEIGHT, &v_BitmapValues[0], &bmi, DIB_RGB_COLORS);

// Cleanup
SelectObject(hDcmem, oldBmp);
DeleteObject(hBmp);
DeleteDC(hDcmem);
ReleaseDC(0, hDc);

感谢您的帮助!

我尝试更改 BitBlt 参数,但无法正确捕获。

c++ bitmap bitblt
© www.soinside.com 2019 - 2024. All rights reserved.