GDI将CDC中的位图保持bmp格式文件,解决GetDIBits调用出错的情况

/// <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.csdn.net/coconut5/article/details/2139968
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值