Я использую 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.
Как мне этого добиться?
Задача ещё не решена.
Других решений пока нет …