位图的结构由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;
}
... {
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;
}