直接上源代码:
#include "stdafx.h" #include <iostream> #include <windows.h> using namespace std; class CSaveByteToBmp { public: bool SaveDIB2Bmp(int fileNum, const CString& BMPFileName, int iWidth, int iHeight, BYTE *pBuffer); void ConstructBih(int nWidth, int nHeight, BITMAPINFOHEADER& bih); void ContructBhh(int nWidth, int nHeight, BITMAPFILEHEADER& bhh);//add 2010-9-04; protected: private: };
然后是cpp:
#include "stdafx.h" #include "SaveByteToBmp.h" //保存buffer到bmp文件 bool CSaveByteToBmp::SaveDIB2Bmp(int fileNum, const CString& BMPFileName, int iWidth, int iHeight, BYTE *pBuffer) { BITMAPINFOHEADER bih; ConstructBih(iWidth, iHeight, bih); BITMAPFILEHEADER bhh; ContructBhh(iWidth, iHeight, bhh); int widthStep = (((iWidth * 24) + 31) & (~31)) / 8; //每行实际占用的大小(每行都被填充到一个4字节边界) int DIBSize = widthStep * iHeight; //buffer的大小 (字节为单位) CFile file; try { if (file.Open(BMPFileName, CFile::modeWrite | CFile::modeCreate)) {//写入文件 file.Write((LPSTR)&bhh, sizeof(BITMAPFILEHEADER)); file.Write((LPSTR)&bih, sizeof(BITMAPINFOHEADER)); file.Write(pBuffer, DIBSize); file.Close(); return true; } } catch (...) { MessageBox(NULL, _T("CSaveByteToBmp::SaveDIB2Bmp"), _T("tips"), MB_ICONERROR); } return false; } //构建BMP位图文件头 void CSaveByteToBmp::ContructBhh(int nWidth, int nHeight, BITMAPFILEHEADER& bhh) //add 2010-9-04 { int widthStep = (((nWidth * 24) + 31) & (~31)) / 8; //每行实际占用的大小(每行都被填充到一个4字节边界) bhh.bfType = ((WORD)('M' << 8) | 'B'); //'BM' bhh.bfSize = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+widthStep * nHeight; bhh.bfReserved1 = 0; bhh.bfReserved2 = 0; bhh.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER); } //构建BMP文件信息头 void CSaveByteToBmp::ConstructBih(int nWidth, int nHeight, BITMAPINFOHEADER& bih) { int widthStep = (((nWidth * 24) + 31) & (~31)) / 8; bih.biSize = 40; // header size bih.biWidth = nWidth; bih.biHeight = nHeight; bih.biPlanes = 1; bih.biBitCount = 24; // RGB encoded, 24 bit bih.biCompression = BI_RGB; // no compression 非压缩 bih.biSizeImage = widthStep*nHeight * 3; bih.biXPelsPerMeter = 0; bih.biYPelsPerMeter = 0; bih.biClrUsed = 0; bih.biClrImportant = 0; }