Сколько памяти должно быть выделено для данных DIB, полученных от HBITMAP с помощью функции getDibits?

StackOverflow https://stackoverflow.com/questions/7304749

Вопрос

Сколько памяти должно быть выделено для данных 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 байта.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top