关于BITMAPINFO中第二个成员RGBQUAD bmiColors[1]的有关问题



typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER    bmiHeader;
    RGBQUAD             bmiColors[1];
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;


BITMAPINFO结构最后是调色板数据,包含若干个RGBQUAD条目,一般来说最大为256个,定义为长度为1的数组是c语言里常用的一个技巧,用来定义可变长度的结构.你在程序里需要分配够保存调色板的大小,最好把mBitmapInfo定义为一个指针
mBitmapInfo = (BITMAPINFO*)malloc(sizeof(BITMAPINFO)+256*sizeof(RGBQUAD));


其实:bmiColors[1] 只是给了一个地址,因为BMP种类多,这个数组的程度是可变的。
新语法可以写成:
bmiColors[]; 就是不完全结构。


BITMAPINFO *pBitmapInfo=(BITMAPINFO*)(new char[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)]);

 pBitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
 pBitmapInfo->bmiHeader.biWidth = m_iImageWidth;
 pBitmapInfo->bmiHeader.biHeight = m_iImageHeight;
 pBitmapInfo->bmiHeader.biPlanes=1;

 pBitmapInfo->bmiHeader.biBitCount=(UINT16)(8);
 pBitmapInfo->bmiHeader.biCompression=BI_RGB;
 pBitmapInfo->bmiHeader.biSizeImage=m_iImageWidth*m_iImageHeight*3;
 pBitmapInfo->bmiHeader.biXPelsPerMeter=0;
 pBitmapInfo->bmiHeader.biYPelsPerMeter=0;
 pBitmapInfo->bmiHeader.biClrUsed=0;
 pBitmapInfo->bmiHeader.biClrImportant=0; 

 for(int i=0;i<256;i++)
 {
  pBitmapInfo->bmiColors[i].rgbRed=(UINT8)i;
  pBitmapInfo->bmiColors[i].rgbGreen=(UINT8)i;
  pBitmapInfo->bmiColors[i].rgbBlue=(UINT8)i;
  pBitmapInfo->bmiColors[i].rgbReserved=0;
 }

你可能感兴趣的:(MFC)