Создайте HBITMAP, который указывает на существующий буфер памяти

Я использую FreeImage библиотека для хранения и обработки растровых данных. Часть моего кода требует, чтобы я сделал снимок экрана с окном (в Windows) и сохранил его как FBITMAP* (Структура растровых данных FreeImage). Метод, который я разработал, состоит из двух этапов: захват изображения, а затем преобразование его в FBITMAP*,

Чтобы сделать снимок, я делаю что-то вроде этого:

HWND window; // Assume this is a valid handle to my window
int width; // width of window client area
int height; // height of window client area

HDC windowDC = GetDC(window);
HDC captureDC = CreateCompatibleDC(windowDC);
HBITMAP screenshot = CreateCompatibleBitmap(windowDC, width, height);
SelectObject(captureDC, screenshot);
BitBlt(captureDC, 0, 0, width, height,
captureDC, 0, 0, SRCCOPY|CAPTUREBLT);

ReleaseDC(window, windowDC);
DeleteDC(captureDC);

FreeImage предоставляет функцию, которая возвращает необработанный указатель на данные пикселей:

BYTE* FreeImage_GetBits(FBITMAP*)

FAQ объясняет, что HBITMAP (Дескриптор WinAPI для растрового изображения) может быть преобразован в FBITMAP* с помощью GetDIBits, который берет источник HBITMAP и необработанный указатель назначения в качестве аргументов, и копирует данные пикселей из одного в другой.

Проблема с этим подходом состоит в том, что я скопировал данные дважды — один раз в BitBlt из окна DC в HBITMAP выбранный в памяти DC, а затем снова из HBITMAP в буфер памяти FreeImage. Я хочу устранить эту неэффективность и скопировать данные непосредственно в мой необработанный указатель в BitBlt операция. Чтобы это работало, мне нужен DC памяти, который имеет HBITMAP выбрал в него, и где это HBITMAP указывает на мой буфер памяти вместо памяти, выделенной для него Windows.

Как мне этого добиться?

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]