vc数字图像处理编程讲座之三.doc

上传人:F****n 文档编号:98044987 上传时间:2019-09-07 格式:DOC 页数:10 大小:43KB
返回 下载 相关 举报
vc数字图像处理编程讲座之三.doc_第1页
第1页 / 共10页
vc数字图像处理编程讲座之三.doc_第2页
第2页 / 共10页
vc数字图像处理编程讲座之三.doc_第3页
第3页 / 共10页
vc数字图像处理编程讲座之三.doc_第4页
第4页 / 共10页
vc数字图像处理编程讲座之三.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《vc数字图像处理编程讲座之三.doc》由会员分享,可在线阅读,更多相关《vc数字图像处理编程讲座之三.doc(10页珍藏版)》请在金锄头文库上搜索。

1、VC数字图像处理编程讲座之三BMP图像的基本操作上一讲我们主要介绍了图像的格式,其中重点说明了BMP文件的存储格式,同时对JEPG和GIF等常用格式作了简单的介绍。本节主要讲述如何操作BMP文件,如对其读、写和显示等。在实现数字图象处理的过程中,主要是通过对图像中的每一个像素点运用各种图像处理算法来达到预期的效果,所以进行图像处理的第一步,也是我们最关心的问题,是如何得到图像中每一个像素点的亮度值;为了观察和验证处理的图像效果,另一个需要解决的问题是如何将处理前后的图像正确的显示出来。我们这章内容就是解决这些问题随着科技的发展,图像处理技术已经渗透到人类生活的各个领域并得到越来越多的应用,但是

2、突出的一个矛盾是图像的格式也是越来越多,目前图像处理所涉及的主要的图像格式就有很多种,如TIF、JEMP、BMP等等,一般情况下,为了处理简单方便,进行数字图像处理所采用的都是BMP格式的图像文件(有时也称为DIB格式的图像文件),并且这种格式的文件是没有压缩的。我们通过操作这种格式的文件,可以获取正确显示图像所需的调色板信息,图像的尺寸信息,图像中各个像素点的亮度信息等等,有了这些数据,开发人员就可以对图像施加各种处理算法,进行相应的处理。如果特殊情况下需要处理其它某种格式的图像,如GIF、JEMP等格式的图象文件,可以首先将该格式转换为BMP格式,然后再进行相应的处理。这一点需要读者清楚。

3、BMP格式的图像文件又可以分为许多种类,如真彩色位图、256色位图,采用RLE(游程编码)压缩格式的BMP位图等等。由于在实际的工程应用和图像算法效果验证中经常要处理的是256级并且是没有压缩的BMP灰度图像,例如通过黑白采集卡采集得到的图像就是这种格式,所以我们在整个讲座中范例所处理的文件格式都是BMP灰度图像。如果读者对这种格式的位图能够作到熟练的操作,那么对于其余形式的BMP位图的操作也不会很困难。BMP灰度图像作为Windows环境下主要的图像格式之一,以其格式简单,适应性强而倍受欢迎。正如我们在上一讲中介绍过的那样,这种文件格式就是每一个像素用8bit表示,显示出来的图像是黑白效果,

4、最黑的像素的灰度(也叫作亮度)值为“0”,最白的像素的灰度值为“255”,整个图像各个像素的灰度值随机的分布在“0”到“255”的区间中,越黑的像素,其灰度值越接近于“0”,越白(既越亮)的像素,其灰度值越接近于“255”;与此对应的是在该文件类型中的颜色表项的各个RGB分量值是相等的,并且颜色表项的数目是256个。在进行图像处理时,操作图像中的像素值就要得到图像阵列;经过处理后的图像的像素值需要存储起来;显示图像时要正确实现调色板、得到位图的尺寸信息等。结合这些问题,下面我们针对性的给出了操作灰度BMP图像时的部分函数实现代码及注释。一、 BMP位图操作首先我们回顾一下上讲中的重要信息:BM

5、P位图包括位图文件头结构BITMAPFILEHEADER、位图信息头结构BITMAPINFOHEADER、位图颜色表RGBQUAD和位图像素数据四部分。处理位图时要根据文件的这些结构得到位图文件大小、位图的宽、高、实现调色板、得到位图像素值等等。这里要注意的一点是在BMP位图中,位图的每行像素值要填充到一个四字节边界,即位图每行所占的存储长度为四字节的倍数,不足时将多余位用0填充。有了上述知识,可以开始编写图像处理的程序了,关于在VC的开发平台上如何开发程序的问题这里不再赘述,笔者假定读者都具有一定的VC开发经验。在开发该图像处理程序的过程中,笔者没有采用面向对象的方法,虽然面向对象的方法可以

6、将数据封装起来,保护类中的数据不受外界的干扰,提高数据的安全性,但是这种安全性是以降低程序的执行效率为代价的,为此,我们充分利用了程序的文档视图结构,在程序中直接使用了一些API函数来操作图像。在微软的MSDN中有一个名为Diblook的例子,该例子演示了如何操作Dib位图,有兴趣的读者可以参考一下,相信一定会有所收获。启动Visual C+,生成一个名为Dib的多文档程序,将CDibView类的基类设为CscrollView类,这样作的目的是为了在显示位图时支持滚动条,另外在处理图像应用程序的文档类(CDibDoc.h)中声明如下宏及公有变量:#define WIDTHBYTES(bits)

7、 (bits) + 31) / 32 * 4)/计算图像每行象素所占的字节数目;HANDLE m_hDIB;/存放位图数据的句柄;CPalette* m_palDIB;/指向调色板Cpalette类的指针;CSize m_sizeDoc;/初始化视图的尺寸,该尺寸为位图的尺寸;最后将程序的字符串表中的字符串资源IDR_DibTYPE修改为:“nDibnDibnDib Files(*.bmp;*.dib)n.bmpnDib.DocumentnDib Document”。这样作的目的是为了在程序文件对话框中可以选择BMP或DIB格式的位图文件。1、 读取灰度BMP位图可以根据BMP位图文件的结构,

8、操作BMP位图文件并读入图像数据,为此我们充分利用了VC的文档视图结构,重载了文挡类的OnOpenDocument()函数,这样用户就可以在自动生成程序的打开文件对话框中选择所要打开的位图文件,然后程序将自动调用该函数执行读取数据的操作。该函数的实现代码如下所示:BOOL CDibDoc:OnOpenDocument(LPCTSTR lpszPathName)LOGPALETTE *pPal;/定义逻辑调色板指针;pPal=new LOGPALETTE;/初始化该指针;CFile file;CFileException fe;if (!file.Open(lpszPathName, CFile

9、:modeRead | CFile:shareDenyWrite, &fe)/以“读”的方式打开文件;AfxMessageBox(图像文件打不开!);return FALSE;DeleteContents();/删除文挡;BeginWaitCursor();BITMAPFILEHEADER bmfHeader;/定义位图文件头结构;LPBITMAPINFO lpbmi;DWORD dwBitsSize;HANDLE hDIB;LPSTR pDIB;/指向位图数据的指针;BITMAPINFOHEADER *bmhdr;/指向位图信息头结构的指针dwBitsSize = file.GetLengt

10、h();/得到文件长度if (file.Read(LPSTR)&bmfHeader, sizeof(bmfHeader) !=sizeof(bmfHeader)return FALSE;/读取位图文件的文件头结构信息;if (bmfHeader.bfType != 0x4d42) /检查该文件是否为BMP格式的文件;return FALSE;hDIB=(HANDLE) :GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize);/为读取图像文件数据申请缓冲区if (hDIB = 0)return FALSE;pDIB = (LPSTR) :G

11、lobalLock(HGLOBAL)hDIB); /得到申请的缓冲区的指针;if (file.ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER) !=dwBitsSize - sizeof(BITMAPFILEHEADER) ):GlobalUnlock(HGLOBAL)hDIB);hDIB=NULL;return FALSE;/此时pDIB数据块中读取的数据包括位图头信息、位图颜色表、图像像素的灰度值;bmhdr=(BITMAPINFOHEADER*)pDIB;/为指向位图信息头结构的指针赋值;:GlobalUnlock(HGLOBAL)

12、hDIB);if (*bmhdr).biBitCount!=8)/验证是否为8bit位图AfxMessageBox(该文件不是灰度位图格式!);return FALSE;m_hDIB=hDIB;/将内部变量数据赋于全局变量;/下面是记录位图的尺寸;m_sizeDoc.x=bmhdr-biWidth;m_sizeDoc.y=bmhdr-biHeight;/下面是根据颜色表生成调色板;m_palDIB=new Cpalette;pPal-palVersion=0x300;/填充逻辑颜色表pPal-palNumEntries=256;lpbmi=(LPBITMAPINFO)bmhdr;for(int

13、 i=0;ipalPalentryi.peRed=lpbmi-bmiColorsi.rgbRed;pPal-palPalentryi.peGreen=lpbmi-bmiColorsi.rgbGreen;pPal-palPalentryi.peBlue= lpbmi-bmiColorsi.rgbBlue;pPal-palPalentryi.peFlags=0;m_palDIB-CreatePalette(pPal);/根据读入的数据得到位图的宽、高、颜色表;if(pPal)delete pPal;EndWaitCursor();SetPathName(lpszPathName);/设置存储路径S

14、etModifiedFlag(FALSE); / 设置文件修改标志为FALSEreturn TRUE;上面的方法是通过CFile类对象的操作来读取位图文件的,它需要分析位图中的文件头信息,从而确定需要读取的图像长度。这种方法相对来说有些繁琐,其实还可以以一种相对简单的方法读取位图数据,首先在程序的资源中定义DIB类型资源,然后添加位图到该类型中,将图像数据以资源的形式读取出来,这时候就可以根据所获取的数据中的位图信息结构来获取、显示图像数据了。下面的函数实现了以资源形式装载图像文件数据,该函数的实现代码如下所示:/HANDLE LoadDIB(UINT uIDS, LPCSTR lpszDib

15、Type)LPCSTR lpszDibRes =MAKEINTRESOURCE(uIDS);/根据资源标志符确定资源的名字;HINSTANCE hInst=AfxGetInstanceHandle();/得到应用程序的句柄;HRSRC hRes=:FindResource(hInst,lpszDibRes, lpszDibType);/获取资源的句柄,这里lpszDibType为资源的名字“DIB”;If(hRes=NULL)return NULLHGLOBAL hData=:LoadResource(hInst, hRes);/转载资源数据并返回该句柄;return hData;2、 灰度位图数据的存储为了将图像

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号