mfc读取并显示图片和彩色转灰度

mfc读取并显示图片和彩色转灰度

ID:8960813

大小:60.01 KB

页数:6页

时间:2018-04-13

mfc读取并显示图片和彩色转灰度_第1页
mfc读取并显示图片和彩色转灰度_第2页
mfc读取并显示图片和彩色转灰度_第3页
mfc读取并显示图片和彩色转灰度_第4页
mfc读取并显示图片和彩色转灰度_第5页
资源描述:

《mfc读取并显示图片和彩色转灰度》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、VC6.0MFC读取并显示图片和彩色转灰度By侯海艳(UCAS)关于MFC读取BMP图片,相信对于很多初学者都是一头雾水,找不着头绪。那么就让我浅浅地说一说到底怎么样读取并显示BMP图片吧。因为我也是初学,摸索学习了四五天,由于有些MFC基础,因此大概理清了MFC读取图片的机理。说的不对请提出宝贵建议,高手请绕道。C++的学习难就难在指针上面,我们必须很好地了解数据的存储方式和指针的基本知识。一般来说,数据存储在内存中是以内存块的形式存储的,即给变量分配一定大小的空间,这个空间就像书架一样,里面装满了一本一本的书

2、,每本书就对应着一个数据单元。我们定义一个指针,指向这个内存块,指针的位置就在内存块的开头,即数据的第一个元素。当我们要获取后面的元素的时候就要移动指针获取。下面会具体说。MFC读取BMP图片的形式有两种(这两种仅仅是我实践过的,也许还有别的方法):第一种就是根据BMP文件的存储方式,按照这种方式自己写代码读取;第二种可以利用两个头文件DIBAPI.H和DIBAPI.CPP,这两个文件定义了读取和获取DIB文件的各种方法,网上可以获取这两个文件。DIB(Device-IndependentBitMap)就是数据无

3、关位图,其实就是BMP文件的一种,这里不多做解释。1.从新建MFC文档开始新建MFC文档的时候,可以选择多文档类型,一般选择默认,但有一点需要注意,当新建这只到了第六步的时候,C*View类的BaseClass要选择CScrollView,而不是默认的CView。如下图:Teeee是我随便命名的工程名(旋转了90度)这样打开文档就可以看到上图中有许多文件,我们所要编辑的主要是Doc.cpp、View.cpp和HeaderFiles里面的Doc.h头文件。在Doc.cpp里面有OnOpenDocument()函数,

4、这个是执行打开文件时响应的函数。读取文件可以在这个里面进行。View.cpp是用来显示图片的。Doc.h里则可以定义一些变量和函数。具体细节不说,这里主要说关键的读取和显示图片的方法。可以用FILE定义一个指向文件的指针pFile。定义一个文件头BITMAPFILEHEADERFilehdr;定义一个信息头BITMAPINFOHEADERInfohdr;当为彩色图像时没有颜色表,不需要定义颜色表,为灰度图像时有颜色表,这时可以定义一个RGBQUAD或BYTE类型的颜色表用以存储颜色表数据。下面可以在定义一个数据部

5、分缓冲区,即指针文件BYTE*pImgData,*pGrayData,这两项要定义在Doc.h文件里,以便画图时使用。要注意的是,DIB文件一行数据的字节数必须是4的倍数,比如一个9行9列的灰度图,一个像素占1字节,那么一行9个像素就占9个字节,但是给这行数据分配存储单元的时候却是分配了12个字节。计算公式可以用(RowBytes=((m_Width*m_PxlBytes*8+31)/32)*4),RowBytes每行字节数,m_Width是图像宽度(每行像元个数),m_PxlBytes是每个像素占的字节数,灰度

6、图是每像素占1字节,24位的RGB图则是3个字节。下面附上部分关键代码:FILE*pFile;if((pFile=fopen(lpszPathName,"r"))==NULL)returnFALSE;//读取位图文件头BITMAPFILEHEADERFilehdr;fread(&Filehdr,sizeof(BITMAPFILEHEADER),1,pFile);//读取文件头if(Filehdr.bfType!=0x4D42){AfxMessageBox(_T("请打开bmp格式文件!"));//格式不对就要重新

7、打开returnFALSE;}//读取位图信息头BITMAPINFOHEADERInfohdr;fseek(pFile,sizeof(BITMAPFILEHEADER),SEEK_SET);//将文件流指针向后移动文件头大小的位置处,以便读取信息头fread(&Infohdr,sizeof(BITMAPINFOHEADER),1,pFile);//指针在位图信息头的位置处,直接读取位图信息头/***文件大小以及表示颜色时所用的位数******/m_Width=Infohdr.biWidth;m_Height=In

8、fohdr.biHeight;m_BitCount=Infohdr.biBitCount;//为什么除以8?m_PxlBytes=Infohdr.biBitCount/8;/****************************************/if(m_PxlBytes!=1&&m_PxlBytes!=3){AfxMessageBox("只能读取8位或24位真

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。