VC/MFC读取BMP文件并显示

自己写过的代码,留作保存,以后不会忘了

先声明几个变量

	BYTE * pBMPDataBuf;//BMP数据buf
	BITMAPFILEHEADER BmpHeader;//BMP图像文件头
	BITMAPINFO BmpInfo;//BMP图像信息结构
	RGBQUAD * pRGBQUAD;//调色板
	DWORD dwBmpDataSize;//BMP数据区大小

在LoadBMPFile函数中读取文件数据
BOOL CBMPControl::LoadBmpFile(CFile& file)
{
	//读取bmp文件头
	file.Read(&BmpHeader,sizeof(BITMAPFILEHEADER));
	//判断BMP类型
	if (BmpHeader.bfType != DIB_MARKER)// 判断是否是DIB对象
	{		
		strBMPError = "不是BMP文件类型";
		return FALSE;
	}
	//读取bmp信息头和第一个颜色表
	file.Read(&BmpInfo,sizeof(BITMAPINFO));

	int iBitNum = GetRGBQUADNum(BmpInfo.bmiHeader.biBitCount);//获得图像位数,确定分配颜色表使用
	if (iBitNum!=0)//不是黑白,16色,256色图片,则没有颜色表
	{
		file.Seek(54,CFile::begin);//从文件开始向后移动54个字节,跳过文件头结构和信息头结构
		pRGBQUAD = new RGBQUAD[iBitNum];
		file.Read(pRGBQUAD,sizeof(RGBQUAD)*iBitNum);
	}

	//移动到BMP数据区指针
	file.Seek(BmpHeader.bfOffBits,CFile::begin);
	dwBmpDataSize = BmpInfo.bmiHeader.biSizeImage;//图像数据大小
	pBMPDataBuf = new BYTE[dwBmpDataSize];
	file.Read(pBMPDataBuf,BmpInfo.bmiHeader.biSizeImage);
	return TRUE;
}

#define DIB_MARKER   ((WORD) ('M' << 8) | 'B')
只是定义的一个宏,判断是否为BMP格式的文件,具体详细的自己搜索吧 GetRGBQUADNum这个函数只是根据位数返回颜色数,24位图和32位图是没有颜色表的

int XXXXXX::GetRGBQUADNum(int ibit)
{
	int iNum=0;
	switch(ibit)
	{
		case 1:
			iNum = 2;
			break;
		case 4:
			iNum = 16;
			break;
		case 8:
			iNum = 256;
			break;
		default:
			iNum = 0;
	}
	return iNum;
}

好了,读到了数据,就显示吧,我只是简单的进行了自动拉伸显示,如果想用其他显示方式,自己再研究吧

BOOL XXXXXXX::DrawBMPAutoRange(CDC *pDC,CRect*rect)//绘制BMP
{
	SetStretchBltMode(pDC->m_hDC,HALFTONE);
	
	::StretchDIBits(pDC->m_hDC,								// 设备环境句柄
		0,                 //目标X坐标
		0,                  // 目标Y坐标
		rect->Width(),            // 目标宽度
		rect->Height(),           // 目标高度
		0,                // 源X坐标
		0,                 // 源Y坐标
		BmpInfo.bmiHeader.biWidth,           // 源宽度
		BmpInfo.bmiHeader.biHeight,          // 源高度
		pBMPDataBuf,                      // 指向dib像素的指针
		&BmpInfo,         // 指向位图信息结构的指针
		DIB_RGB_COLORS,                 // 使用的颜色数目
		//DIB_PAL_COLORS,
		SRCCOPY);                       // 光栅操作类型	
	/*SetDIBitsToDevice*/
	return TRUE;
}





©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值