bmiColors字段的BITMAPINFO结构

时间:2014-02-04 17:09:00

标签: c++ windows bitmap

BITMAPINFO结构具有以下声明

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

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

无论是静态与否都无关紧要。问题是,你仍然需要为调色板分配足够的内存。这是一个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;
}

答案 2 :(得分:1)

声明中没有static关键字。这是一个完全普通的struct成员。它用于声明一个可变大小的结构,最后带有一个可变大小的数组

仅在编译时才知道数组的大小,但是由于arrays of size 0 are forbidden in C and C++,所以我们将改用array[1]。请参见Why do some structures end with an array of size 1?

中MS的Raymond Chen的详细说明。

在某些编译器(例如GCC零长度数组)上,可以将其作为扩展名,因此Linux和许多其他平台通常使用array[0]而不是array[1]

  

在GNU C中允许声明零长度数组作为扩展。零长度数组可以用作结构的最后一个元素,该结构实际​​上是可变长度对象的标头:

struct line {
  int length;
  char contents[0];
};

struct line *thisline = (struct line *)
  malloc (sizeof (struct line) + this_length);
thisline->length = this_length;
     

Arrays of Length Zero

在C99中,引入了称为flexible array member的新功能。从那时起,最好使用array[]来实现可移植性

struct vectord {
    size_t len;
    double arr[]; // the flexible array member must be last
};

另请参见