Как быстро растровое изображение HDC можно скопировать в 3-мерный массив? - PullRequest
0 голосов
/ 29 апреля 2019

Я сохраняю данные rgb изображения из растрового изображения HDC в трехмерном массиве, перебирая каждый пиксель с помощью GetPixel(hdc, i, j).

Работает, но эта функция невероятно медленная. Даже для больших изображений (1920x1080 = 6,220,800 значений, исключая альфа), это не должно занимать столько времени, сколько есть.

Я искал в Интернете альтернативы этому, но ни один из них не очень чистый / читабельный, по крайней мере для меня.

По сути, я хочу, чтобы растровое изображение 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);

1 Ответ

0 голосов
/ 30 апреля 2019

Спасибо Рэймонду Чену за введение функции "GetDIBits" и этому другому потоку, мне наконец-то удалось заставить его работать.

Это довольно быстро по сравнению с предыдущим, хотя яЯ получаю некоторые проблемы с превышением размера стека для больших изображений, должно быть довольно легко исправить, хотя.Вот код, который заменяет то, что находится в разделе «// сохранить растровое изображение в массиве»:

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);
...