HBITMAP 或 HDC 到 uint8[]

HBITMAP or HDC to uint8[]

我通过执行以下操作获得了屏幕截图:

  1. GetDesktopWindow
  2. GetDC
  3. GetClientRect
  4. CreateCompatibleBitmap

这给了我一个 HBITMAP,我可以选择将它带到 HDC

  1. CreateCompatibleDC

我的目标是从第 4 步 (CreateCompatibleBitmap) 或第 5 步 (CreateCompatibleDC) 得到一个 uint8 字节数组,这可能吗?

谢谢

您需要使用 CreateCompatibleDC() 创建一个新的 DC,使用 CreateDIBSection() 为此 DC 创建一个 DIB(设备无关位图), select 新 DC 中的 DIB 使用SelectObject(),然后使用 BitBlt() 从您的原始 DC 复制到新的 DC。 CreateDIBSection 检索到的指针将指向原始数据。此数据由系统分配,这意味着您不需要自己分配它,但是当您为 DIB 调用 DeleteObject() 时,它会被释放。

这是一个 C 语言的例子:

HDC hdcMemoryDC = CreateCompatibleDC(yourDC);

BITMAPINFO bmi;

memset(&bmi, 0, sizeof(BITMAPINFO));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = width;
bmi.bmiHeader.biHeight = -height;    // top-down
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;

HBITMAP hbmp;
COLORREF *pixelBuffer;
hbmp = CreateDIBSection( hdcMemoryDC, &bmi, DIB_RGB_COLORS, (VOID**)&pixelBuffer, NULL, 0 );

SelectObject( hdcMemoryDC, hbmp );

BitBlt( hdcMemoryDC, 0, 0, width, height, yourDC, 0, 0, SRCCOPY );