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; }