Начните с получения параметров растрового изображения, записанных Windows:
BITMAP bitmap = {0};
GetObject(ii.hbmColor, sizeof(bitmap), &bitmap);
Вы можете использовать возвращаемые значения для заполнения структуры bmi
.
И о bmi
структура: BITMAPINFO
не не резервирует достаточно места для палитры.Вы должны создать свою собственную структуру для этого:
struct BitmapPlusPalette
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD palette[256];
};
Вычислить количество байтов, необходимых для растрового изображения, немного сложно, потому что его необходимо округлить:
w = ((bitmap.bmWidth * bitmap.bmBitsPixel) + 31) / 8;
byte* bits = new byte[w * bitmap.bmHeight];
исправленная версия вашей последней строки:
int rv = ::GetDIBits(dc, ii.hbmColor, 0, bitmap.bmHeight, bits, (BITMAPINFO *)&bmi, DIB_RGB_COLORS);