位图的结构由4部分组成,位图文件头、位图信息头、颜色表和颜色数据,32位或者24位不需要颜色表即调色板,8位则需要填写调色板数据,另外要注意的就是8位位图的一行的跨度必须是4的整数倍,否则就显示不出正确的图形。代码如下: BOOL SaveBitmap8(HANDLE hFile, int nWidth, int nHeight, RGBQUAD * pRgbquad, BYTE * pColorData) ... { ASSERT(hFile != INVALID_HANDLE_VALUE); ASSERT(pRgbquad != NULL); ASSERT(pColorData != NULL); //一行的跨度必须为4的整数倍 int cx = (nWidth % 4 == 0 ? nWidth : nWidth / 4 * 4 + 4); //数据的大小 DWORD dwSize = cx * nHeight * sizeof(BYTE); BITMAPFILEHEADER bfh; //位图文件头 bfh.bfReserved1 = 0; bfh.bfReserved2 = 0; bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD); bfh.bfSize = dwSize + bfh.bfOffBits; bfh.bfType= (WORD)('M' << 8) | 'B'; BITMAPINFOHEADER bih; //位图信息头 bih.biSize = sizeof(bih); bih.biWidth = nWidth; //这里为实际的宽度 bih.biHeight = nHeight; bih.biPlanes = 1; bih.biBitCount = 8; bih.biCompression = 0; bih.biSizeImage = dwSize; bih.biXPelsPerMeter = 0; bih.biYPelsPerMeter = 0; bih.biClrUsed = 256; bih.biClrImportant = 0; //写位图文件头 ...... //写位图信息头 ...... //写颜色表 ...... //写颜色数据 ...... return TRUE; }