VC/MFC读取BMP文件并显示

来源:互联网 发布:手机mp3变速软件 编辑:程序博客网 时间:2024/05/01 00:02

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

先声明几个变量

BYTE * pBMPDataBuf;//BMP数据bufBITMAPFILEHEADER 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;}





原创粉丝点击