我试图从一个包含像素颜色值的数组创建一个HBITMAP。问题是当我试图创建一个24-bpp位图时,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条答案
按热度按时间eqfvzcg81#
Windows中DIB位图的约定是BGR。你不能改变它。你只能适应它。
o8x7eapl2#
例如,如果您将 *.bmp文件加载到内存中,或者创建一个变量,例如DWORD cRef = 0xFF 0000,并使用它填充内存,在第二种情况下,您将看到红色,因此在两种情况下,字节顺序均为BGR(在源代码编辑器中,所提到的变量的值为0xRRGGBB)。但是!尝试调用SetTextColor(hDc,cRef)左右。同样的值将是蓝色,所以这将是一个地狱般的适应,因为Windows的DIB位图惯例正好相反的Windows惯例,例如HBRUSH对象。我真的很想知道这在哪方面是有用的。