Сколько памяти должно быть выделено для данных DIB, полученных от HBITMAP с помощью функции getDibits?
-
25-10-2019 - |
Вопрос
Сколько памяти должно быть выделено для данных DIB, полученных от HBITMAP с помощью функции getDibits?
Функция getDibits описана в MSDN следующим образом:
int GetDIBits(
__in HDC hdc,
__in HBITMAP hbmp,
__in UINT uStartScan,
__in UINT cScanLines,
__out LPVOID lpvBits,
__inout LPBITMAPINFO lpbi,
__in UINT uUsage
);
Тем не менее, буфер для получения данных LPVBIT должен быть выделен перед вызовом getDibits, поскольку getDibits не выделяет это автоматически.
Вопрос в том, сколько памяти должно быть выделено для получения данных DIB? Предполагается, что HBITMAP имеет ширину и высоту как BMP_WIDTH & BMP_HEITH; и растровый карта 32-битная (RGBA).
Решение
Я думаю, что самый простой способ - вызов функции getObject () (и, кстати, получить биты изображения):
BITMAP bmpObject;
GetObject(hBitmap, sizeof(BITMAP), &bmpObject);
Затем вы просто используете растровые поля:
LONG size = bmpObject.bmWidthBytes * bmpObject.bmHeight;
Помните о выравнивании, какая обработка байтов изображения!
Надеюсь, это будет полезно!
Другие советы
Память, на которую указано LPVBITS, должна быть размер одной линии сканирования, когда высота. Каждая линия сканирования должна быть выровнена на границе DWORD.
Поскольку вы используете 32 -битный цвет, каждый линия Scanline, естественно, удовлетворит это требование, если вы гарантируете, что первый линий сканирования, то есть начало блока памяти, выровнен 4 байта.
Таким образом, ответ, измеренный в байтах, имеет высоту ширины 4*, выровнен для начала на границе 4 байта.