我通过使用GetPixel(hdc, i, j)
遍历每个像素,将来自HDC位图的图像rgb数据存储在3d阵列中。
它可以工作,但是此功能非常慢。即使对于大图像(1920x1080 = 6,220,800值,不包括alpha值),也不应花太多时间。
我一直在网上寻找替代方案,但是至少对于我来说,它们都不是很干净/可读的。
基本上,我希望将hdc位图更快地复制到unsigned char the_image[rows][columns][3]
。
这是当前代码。我需要帮助来改善//store bitmap in array
// copy window to bitmap
HDC hScreen = GetDC(window);
HDC hDC = CreateCompatibleDC(hScreen);
HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, 256, 256);
HGDIOBJ old_obj = SelectObject(hDC, hBitmap);
BOOL bRet = BitBlt(hDC, 0, 0, 256, 256, hScreen, 0, 0, SRCCOPY);
//store bitmap in array
unsigned char the_image[256][256][3];
COLORREF pixel_color;
for (int i = 0; i < 256; i++) {
for (int j = 0; j < 256; j++) {
pixel_color = GetPixel(hDC, i, j);
the_image[i][j][0] = GetRValue(pixel_color);
the_image[i][j][1] = GetGValue(pixel_color);
the_image[i][j][2] = GetBValue(pixel_color);
}
}
// clean up
SelectObject(hDC, old_obj);
DeleteDC(hDC);
ReleaseDC(NULL, hScreen);
DeleteObject(hBitmap);
答案 0 :(得分:0)
感谢Raymond Chen引入了“ GetDIBits”功能和this其他线程,我终于设法使其正常工作。
与以前相比,它几乎是瞬时的,尽管我遇到了超出大图像的堆栈大小的问题,但这应该是一个相当容易的修复。这是替换“ //将位图存储在数组中”下的代码的代码:
BITMAPINFO MyBMInfo = { 0 };
MyBMInfo.bmiHeader.biSize = sizeof(MyBMInfo.bmiHeader);
GetDIBits(hDC, hBitmap, 0, 0, NULL, &MyBMInfo, DIB_RGB_COLORS);
MyBMInfo.bmiHeader.biBitCount = 24;
MyBMInfo.bmiHeader.biCompression = BI_RGB;
MyBMInfo.bmiHeader.biHeight = abs(MyBMInfo.bmiHeader.biHeight);
unsigned char the_image[256][256][3];
GetDIBits(hDC, hBitmap, 0, MyBMInfo.bmiHeader.biHeight,
&the_image[0], &MyBMInfo, DIB_RGB_COLORS);