BITMAPINFO结构的bmiColors字段

BITMAPINFO结构具有以下声明

 typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; } BITMAPINFO; 

为什么RGBQUAD数组是静态的? 为什么它不是一个指针?

声明一个可变大小的结构是一个标准的技巧。 颜色表从来不会有一个条目,它至少有2个单色位图,对于8bpp位图通常是256个等等。由bmiHeader.biClrUsed成员指示。 所以结构的实际大小取决于位图格式。

由于C语言不允许声明这样的数据结构,所以这是最接近的匹配。 创建结构需要malloc()分配足够的字节来存储结构,从biClrUsed计算。 然后简单的转换为(BITMAPINFO *)使其可用。

没关系,也不是静止的。 事情是,你仍然必须为调色板分配足够的内存。 这是一个RGBQuad,因为它只存储R,G,B,A等等。

例:

 for(i = 0; i < 256; i++) { lpbmpinfo->bmiColors[i].rgbRed = some_r; lpbmpinfo->bmiColors[i].rgbGreen = some_g; lpbmpinfo->bmiColors[i].rgbBlue = some_b; lpbmpinfo->bmiColors[i].rgbReserved = 0; }