Какой объем памяти должен быть выделен для данных DIB, полученных из HBITMAP с использованием функции GetDIBits? - PullRequest
2 голосов
/ 05 сентября 2011

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

Однако буфер для приема данных lpvBits должен быть выделен перед вызовом GetDIBits, поскольку GetDIBits не выделяет это автоматически.

Вопрос в том, сколько памяти должно быть выделено для получения данных DIB? Предполагается, что HBITMAP имеет ширину и высоту как Bmp_Width & Bmp_Height; и растровое изображение является 32-разрядным (RGBA).

Ответы [ 2 ]

1 голос
/ 05 сентября 2011

Память, на которую указывает lpvBits, должна быть размером в одну строку сканирования, умноженную на высоту.Каждая строка сканирования должна быть выровнена по границе DWORD.

Поскольку вы используете 32-битный цвет, то каждая линия сканирования естественным образом удовлетворит это требование, при условии, что вы гарантируете, что первая строка сканирования, то есть начало блока памяти, выровнен на 4 байта.

Таким образом, ответ, измеренный в байтах, равен 4 * width * height, выровнен для начала на границе 4 байта.

1 голос
/ 05 сентября 2011

Я думаю, что самый простой способ - вызвать функцию GetObject () (и, кстати, чтобы получить биты изображения):

BITMAP bmpObject;
GetObject(hBitmap, sizeof(BITMAP), &bmpObject);

Затем вы просто используете битовые поля:

LONG size = bmpObject.bmWidthBytes * bmpObject.bmHeight;

Помните о выравнивании при обработке байтов изображения!

Надеюсь, это будет полезно!

...