保存内存数据为bmp图片:24位3通道1

windows C++保存位图系列

调用实例:

    BYTE *pdata = new BYTE[m_iImgDataW * m_iImgDataH * 3];
	int k = 0;

	//保存mtsd和png文件
	int iCount = 3;
	int iPos = 0;
	int iWNum = m_iImgDataW * 3;
	for (int i = 0; i< m_iImgDataW; ++i)
	{
		iPos = i * iCount;
		for (int j = 0; j< m_iImgDataH; ++j)
		{

			k = j * iWNum + iPos;
			pdata[k] = (BYTE)m_ppImgData[i][j];
			pdata[k + 1] = (BYTE)m_ppImgData[i][j];
			pdata[k + 2] = (BYTE)m_ppImgData[i][j];

		}
	}


	SaveBMP(m_octPngPath, pdata, m_iImgDataW, m_iImgDataH, 3);

实现函数:

// 函数名称:  SaveBMP
// 功能: 根据位图数组生成一个位图
// 输入参数: fileName 所保存的位图名称(需加上扩展名)
//			m_buf_tmp 位图数组
//			nwidth nheight iCount 位图数组的宽度,高度,位数(注: 如24位位图 iCount 应为 3 )
// 返回值: 生成位图文件成功 TRUE 否则 FALSE
BOOL SaveBMP(const CString fileName, const BYTE * m_buf_tmp, const UINT nwidth, const UINT nheight, const UINT iCount)//huangguihualogo
{
	// 参数验证
	ASSERT(!fileName.IsEmpty() && m_buf_tmp != NULL && nwidth > 0 && nheight > 0 && iCount > 0);

	bool bRVal = TRUE;	// 返回值

	BITMAPINFO *m_pBmpInfo = NULL;//位图信息结构
	BYTE *pInfoBuffer = NULL;

	ReSize1dDataPointer(pInfoBuffer, sizeof(BITMAPINFO));

	if (pInfoBuffer)
	{
		//  m_pBmpInfo即指向m_chBmpBuf缓冲区,用户可以自己分配BTIMAPINFO缓冲区	
		m_pBmpInfo = (BITMAPINFO *)pInfoBuffer;
		//初始化BITMAPINFO 结构,此结构在保存bmp文件、显示采集图像时使用
		m_pBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
		//	图像宽度,一般为输出窗口宽度
		m_pBmpInfo->bmiHeader.biWidth = nwidth;
		m_pBmpInfo->bmiHeader.biHeight = nheight;
		//	图像位深度,
		m_pBmpInfo->bmiHeader.biBitCount = iCount * 8;
		//	对于低于8位的位图,还应设置相应的位图调色板	
		m_pBmpInfo->bmiHeader.biPlanes = 1;
		m_pBmpInfo->bmiHeader.biCompression = BI_RGB;
		m_pBmpInfo->bmiHeader.biSizeImage = nwidth*nheight*iCount;
		m_pBmpInfo->bmiHeader.biXPelsPerMeter = 0;
		m_pBmpInfo->bmiHeader.biYPelsPerMeter = 0;
		m_pBmpInfo->bmiHeader.biClrUsed = 0;
		m_pBmpInfo->bmiHeader.biClrImportant = 0;

		BITMAPFILEHEADER  bfh = { 0 };
		DWORD dwImageSize = 0;
		DWORD dwBytesRead = 0;

		dwImageSize = nwidth * nheight  * iCount;	//计算图像大小,由视频输出窗口和视频格式确定

		bfh.bfType = (WORD)'M' << 8 | 'B';			//定义文件类型
		bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);	//定义文件头大小	
		bfh.bfSize = bfh.bfOffBits + dwImageSize;		//文件大小	

		try {

			HANDLE hFile = ::CreateFile(fileName,
				GENERIC_WRITE,
				0,
				NULL,
				CREATE_ALWAYS,
				FILE_ATTRIBUTE_NORMAL,
				NULL
				);
			if (hFile == INVALID_HANDLE_VALUE)
			{
				bRVal = FALSE;
			}
			else
			{
				::WriteFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &dwBytesRead, NULL);

				::WriteFile(hFile, m_pBmpInfo, sizeof(BITMAPINFOHEADER), &dwBytesRead, NULL);

				::WriteFile(hFile, m_buf_tmp, dwImageSize, &dwBytesRead, NULL);

				CloseHandle(hFile);
			}
		}
		catch (...)
		{
			bRVal = FALSE;
		}

		ReSize1dDataPointer(pInfoBuffer, 0);
	}
	else
	{
		bRVal = FALSE;
	}

	return bRVal;
}

本质与实现一是相同的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haimianjie2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值