winapi - CreateDIBitmap в 24bpp находится в BGR, а не в RGB

Я пытаюсь создать HBITMAP из массива, который будет содержать значения цвета для пикселей. Дело в том, что когда я пытаюсь создать 24-битное растровое изображение, CreateDIBItmap использует значения BGR вместо RGB, как мне бы хотелось.

Код для создания растрового изображения выглядит следующим образом:

 image_size = 600 * 600 * 3;
 aimp_buffer = (char *)malloc(image_size * sizeof(char));
 for (counter = 0; counter < image_size;)
 {
     aimp_buffer[counter++] = 255;
     aimp_buffer[counter++] = 0;
     aimp_buffer[counter++] = 0;
 }

 ads_scrbuf->avo_buffer = (void *)aimp_buffer;
 ads_scrbuf->im_height = 600;
 ads_scrbuf->im_width = 600;
 ads_scrbuf->im_scanline = 600;

 memset(&info, 0, sizeof(info));
 memset(&info.bmiHeader, 0, sizeof(info.bmiHeader));
 info.bmiHeader.biBitCount = 24;
 info.bmiHeader.biHeight= -600;
 info.bmiHeader.biWidth= 600;
 info.bmiHeader.biSize = sizeof(info.bmiHeader);
 info.bmiHeader.biPlanes = 1;
 info.bmiHeader.biCompression = BI_RGB;

 memset(&header, 0, sizeof(BITMAPV5HEADER));
 header.bV5Width = 600;
 header.bV5Height = 600;
 header.bV5BitCount = 24;
 header.bV5Size = sizeof(BITMAPV5HEADER);
 header.bV5Planes = 1;
 header.bV5Compression = BI_RGB;

 *adsp_hBitmap = CreateDIBitmap(GetDC(ds_apiwindow), (BITMAPINFOHEADER *)&header, 
     CBM_INIT, (void *)ads_scrbuf->avo_buffer, &info, DIB_RGB_COLORS)

Это должно создать красный фон для всего изображения, но вместо этого он синий.

2 ответа

Решение

Соглашение Windows для растровых изображений DIB - BGR. Вы не можете это изменить. Вам просто придется адаптироваться к этому.

Если вы загрузите, например, файл *.bmp в память или, вернее, сделаете переменную, скажем, DWORD cRef = 0xFF0000 и заполните ею память, во втором случае вы увидите КРАСНЫЙ цвет, поэтому порядок байтов в обоих случаях BGR (см. как значение 0xRRGGBB в редакторе исходного кода для указанной переменной). Но! Попробуйте вызвать, например, SetTextColor(hDc, cRef) или около того. То же самое значение будет СИНИМ, так что это будет адская адаптация, потому что соглашение Windows для растровых изображений DIB прямо противоположно соглашению Windows, например, для объектов HBRUSH. Мне действительно интересно, каким образом это полезно ..

Другие вопросы по тегам