HBITMAP 或 HDC 到 uint8[]
HBITMAP or HDC to uint8[]
我通过执行以下操作获得了屏幕截图:
GetDesktopWindow
GetDC
GetClientRect
CreateCompatibleBitmap
这给了我一个 HBITMAP
,我可以选择将它带到 HDC
:
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 );
我通过执行以下操作获得了屏幕截图:
GetDesktopWindow
GetDC
GetClientRect
CreateCompatibleBitmap
这给了我一个 HBITMAP
,我可以选择将它带到 HDC
:
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 );