/// <summary>
/// 保存图像
/// </summary>
/// <param name="str">路径</param>
/// <param name="bitmap">图片</param>
/// <param name="pDC">CDC</param>
void SaveBmpFile(const char* pPath,CBitmap& bitmap,CDC* pDC)
{
BITMAP bitm;
bitmap.GetBitmap(&bitm);
//1.BITMAP文件头部
BITMAPFILEHEADER bfh;
bfh.bfReserved1 = bfh.bfReserved2 = 0;
bfh.bfType = ((WORD)('M'<< 8)|'B');
bfh.bfSize = 54 + bitm.bmWidthBytes * bitm.bmHeight;
bfh.bfOffBits = 54;
//2.BITMAP信息
BITMAPINFO bmpinfo;
memset(&bmpinfo, 0, sizeof(bmpinfo)); //必须加上次行,否则GetDIBits为其赋值的是否必出错
bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); //必须设置大小,WINDOWS的通用做法
//第一次调用获取位图信息,填充到bmpinfo
if( 0 == ::GetDIBits(pDC->GetSafeHdc(), (HBITMAP)bitmap.GetSafeHandle(), 0, 0, nullptr, &bmpinfo, DIB_RGB_COLORS) )
{
TRACE("设置图片信息出错\n");
return ;
}
//3.BITMAP具体信息
// 位图信息及调色板大小
DWORD InfoSize = bmpinfo.bmiHeader.biSize + bmpinfo.bmiHeader.biClrUsed * sizeof(RGBQUAD);
//缓冲区大小
int nsize = bmpinfo.bmiHeader.biSizeImage + InfoSize;
char *pTempBits = new char [nsize];
memcpy(pTempBits,&bmpinfo,InfoSize);
if( 0 == GetDIBits(pDC->GetSafeHdc(), (HBITMAP)bitmap.GetSafeHandle(), 0, bmpinfo.bmiHeader.biHeight, pTempBits+InfoSize, (LPBITMAPINFO)pTempBits, DIB_RGB_COLORS) )
{
TRACE("设置图片信息出错\n");
return ;
}
std::fstream file;
file.open(pPath,std::ios::out|std::ios::binary);
if( file.fail() )
{
delete [] pTempBits;
TRACE("打开文件出错\n");
return ;
}
file.write((char*)&bfh,sizeof(bfh));
file.write(pTempBits,nsize);
file.close();
delete [] pTempBits;
}
参考:http://support.microsoft.com/kb/80080/en-us
参考:http://blog.youkuaiyun.com/coconut5/article/details/2139968