自己写过的代码,留作保存,以后不会忘了
先声明几个变量
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;
}