网上一堆的说法,我用了都不行,包括那个写好的和我差不多的。
不过我只要存成24位的图就行了。以下上代码:
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER
void SaveBMP()
{
HANDLE fh;//文件句柄
BITMAPFILEHEADER bmfHdr; //位图文件头结构
BITMAPINFOHEADER bmfInfo; //位图信息头结构
DWORD bmwidth,bmsize,dwWritten,dwDIBSize;
BYTE *pBmpBuff=new BYTE [m_Width*m_Height*3];//数据内存
CString BMPname;//文件名字
fh = CreateFile(BMPname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh != INVALID_HANDLE_VALUE)
{
bmwidth=(((m_Width*24)+31)>>5)<<2;
bmsize=bmwidth*m_Height;
// 设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof (BITMAPFILEHEADER)
+ sizeof (BITMAPINFOHEADER)
+ bmsize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof (BITMAPFILEHEADER)
+ (DWORD)sizeof (BITMAPINFOHEADER);
bmfInfo.biSize = sizeof (BITMAPINFOHEADER);
bmfInfo.biWidth = m_Width;
bmfInfo.biHeight = m_Height;
bmfInfo.biPlanes = 1;
bmfInfo.biBitCount = 24;
bmfInfo.biCompression = BI_RGB;
bmfInfo.biSizeImage = 0;
bmfInfo.biXPelsPerMeter = 0;
bmfInfo.biYPelsPerMeter = 0;
bmfInfo.biClrUsed = 0;
bmfInfo.biClrImportant = 0;
// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
// 写入位图信息头
WriteFile(fh, (LPSTR)&bmfInfo, sizeof(BITMAPINFOHEADER), &dwWritten, NULL);
// 写入位图像素
WriteFile(fh, (LPSTR)pBmpBuff, bmsize,
&dwWritten, NULL);
CloseHandle(fh);
}
delete pBmpBuff;
}