BITMAPINFOHEADER bmiHeader;
memset(&bmiHeader, 0, sizeof(bmiHeader));
bmiHeader.biSize = sizeof(bmiHeader);
bmiHeader.biWidth = nWidth;
bmiHeader.biHeight = nHeight;
bmiHeader.biPlanes = 1;
bmiHeader.biBitCount = 24;
bmiHeader.biCompression = BI_RGB;
// поскольку мы оставили поле biClrUsed нулем, то структура
// BITMAPINFO целиком нам, в общем-то, не нужна, поскольку
// таблица цветов не используется. Будет достаточно одного
// заголовка
// рассчитываем размер буфера для изображения с учетом того,
// что строки должны быть выравнены на sizeof(DWORD)
DWORD cbLine = (nWidth * 3 + (sizeof(DWORD) - 1)) & ~(sizeof(DWORD) - 1);
DWORD cbImage = cbLine * nHeight;
// выделяем память для буфера, в который будут помещены данные
// изображения
PVOID pBits = malloc(cbImage);
if (pBits == NULL) // TODO:
HDC hDC = GetDC(NULL); // любой контекст устройства подойдет
// вызываем GetDIBits
if (!GetDIBits(hDC, hBitmap, 0, nHeight, pBits,
(BITMAPINFO *)&bmiHeader, DIB_RGB_COLORS))
// TODO:
ReleaseDC(NULL, hDC);