2913101958VC课程设计图像直方图处理均衡化处理MFC

上传人:1888****888 文档编号:36129136 上传时间:2021-10-29 格式:DOC 页数:50 大小:1.13MB
收藏 版权申诉 举报 下载
2913101958VC课程设计图像直方图处理均衡化处理MFC_第1页
第1页 / 共50页
2913101958VC课程设计图像直方图处理均衡化处理MFC_第2页
第2页 / 共50页
2913101958VC课程设计图像直方图处理均衡化处理MFC_第3页
第3页 / 共50页
资源描述:

《2913101958VC课程设计图像直方图处理均衡化处理MFC》由会员分享,可在线阅读,更多相关《2913101958VC课程设计图像直方图处理均衡化处理MFC(50页珍藏版)》请在装配图网上搜索。

1、课程设计报告 课程: VC+面向对象程序设计 项目: 图像直方图处理 班级: 通信1103 姓名: 学号: 时间:20132014学年上学期13周 目录 第一部分 进程安排.第二部分 实践内容.1、 项目名称 2、 实践目的与要求3、 实践工具与准备4、 课程设计报告格式及要求第三部分 实践过程.1、 项目名称2、 实践目的与要求3、 实验前准备.4、 实验分析5、 实现步骤第四部分 测试与结论第五部分 实践总结第六部分 实践心得.第七部分 参考文献.第一部分 进程安排 本次实践时间为两周,共5天。具体时间安排如下:序号内容安排天数1布置实践任务(由指导老师指定课题,分配任务,讲解整个实践的整

2、体要求。)0.52查资料、定方案(学生根据课题要求查找相关资料,并确定整个设计方案。)0.53编写方案和程序流程报告(学生自己设计方案和程序流程,形成书面报告)14方案评估(学生在课上给出方案分析;指导老师对学生提交的方案进行综合评估,总结几种较好的设计方案进行实践)。0.5(星期三上午)4编写程序与调试(学生根据方案和程序流程编写程序并且调试)1.56实践总结(学生完成实践报告,指导老师对学生设计进行评估定级)1第二部分 实践内容一、项目名称:图像直方图处理二、实践目的与要求1了解BMP图像的基本格式;2了解BMP图像文件的打开和存储;3利用VC编写BMP图像的打开和存储的程序;4了解对灰度

3、图像进行直方图统计的过程;5在计算机上调试程序。6直方图是对图像每一亮度间隔内像元频数的统计。它描绘了图像的总概貌,给出了图像亮度与颜色范围、每个亮度间隔的频数、像元依亮度分布的形态以及彩色分量的色调。但不知道某一亮度值像元出现的概率处于什么位置。将一幅图像划分成一些子图像,整个图像的直方图等于各个子图像 的直方图之和,不同的图像可能具有相同的直方图。利用直方图可检验输入图像亮度值在量化范围内是否分配得恰当,图像数字化后的灰度级与实际占用灰度级的提高了很多,有很好的对比度。试开发一个图像直方图处理软件,要求如下:1、 菜单式的人机界面。2、 具有文件处理功能3、 图像直方图处理部分应具有直方图

4、均衡化(非适应性直方图修正)和直方图规定化(适应性直方图修正)两个模块。三、实验前准备1预习本实验中关于BMP图像文件的基本格式;2了解本实验的目的和实验内容。3在开始实验前,应回顾或复习相关内容。需要一台计算机,其中安装有 Visual C+ 6 .0 、 Visual C+ 2005 、 Visual C+ 2005 Express、等集成开发环境软件。四、实验分析(一)、原理分析 1、灰度直方图 直方像图反映了图的像素的灰度分布是反映一幅图像中的灰度级与出现这种灰度级的像素的概率之间关系的图形。 直方图的横坐标为灰度级(用r表示),纵坐标是具有该灰度级的像素个数或出现此灰度级的概率P(r

5、k)。 设N(=ab)为一幅图像中像素总数,nk为第k级灰度的像素数;r k表示第k个灰度级。则: P(rk)= nk /N (归一化后k级灰度像素数) 定义:反映各灰度级出现频数的分布情况,进而反映图像对(清晰)度,但不反映各灰度级的空间位置分布。图像的(灰度统计)直方图是一个一维的离散函数。它的定义为:设sk为图像f(x,y)的第k级灰度值,nk是f(x,y)中具有灰度值sk的象素的个数,n是图像象素总数,则:ps(sk)= nk/n k=0,1,L-1称为图像f(x,y)的直方图。这里ps(sk)代表原始图中第k个灰度级的出现概率。以nk为自变量,以ps(sk)为函数,得到的曲线就是图像

6、的直方图,在实际中常常直接将对第k个灰度级的统计值nk作为图像的直方图。它提供了原图灰度值的分布情况,也可以说给出了一幅图所有灰度值的整体描述。对灰度图像进行直方图统计的程序流程图如图2-2所示。输入图像按照图像中灰度的级数建立数组G(i)如果f(x,y)=i,则,G(i)=G(i)+1输出直方图 图2-2 灰度图像直方图统计流程2、直方图均衡化如上面所述,一幅给定的图像的灰度级分布在0 r 1范围内。可以对0, 1区间内的任一个 r 值进行如下变换 也就是说,通过上述变换,每个原始图像的像素灰度值 r 都对应产生一个 s 值。 变换函数T(r)应满足下列条件:(1)在0r1区间内,T(r)单

7、值单调增加;(2)对于0r1,有0T(r)1。这里的第一个条件保证了图像的灰度级从白到黑的次序不变。第二个条件则保证了映射变换后的像素灰度值在允许的范围内。3、直方图规定化希望能够有目的地增强某个灰度区间的图像, 即能够人为地修正直方图的形状, 使之与期望的形状相匹配,这就是直方图规定化的基本思想。换句话说,希望可以人为地改变直方图形状,使之成为某个特定的形状,直方图规定化就是针对上述要求提出来的一种增强技术,它可以按照预先设定的某个形状来调整图像的直方图。直方图规定化是在运用均衡化原理的基础上,通过建立原始图像和期望图像之间的关系,选择地控制直方图,使原始图像的直方图变成规定的形状,从而弥补

8、了直方图均衡不具备交互作用的特性。4、BMP图像文件格式BMP图像文件是Microsoft Windows所规定的图像文件格式。随着Windows的风行全球,BMP图像文件也就成为PC机上流行的图像文件格式。BMP图像文件具有下列六项特色。(1)文件结构只能存放一幅图像。(2)可以存储单色、16色、256色和全彩色四种图像数据。(3)图像数据可选择压缩或不压缩处理(4)Windows设计了两种压缩方式:RLE4和RLE8。RLE4处理16色图像数据;而RLE8则是压缩256图像数据。(5)图像数据排列顺序,与一般图像文件有所不同。(6)调色板的数据结构特殊。(二)课程设计项目的实现方法1、直方

9、图均衡化过程(算法):(1)列出原始图灰度级rk;(2)统计原始直方图各灰度级像素数nk;(3)计算原始直方图各概率:pk=nk/N;(4)计算累计直方图:sk=pk;(5)取整Sk=int(L-1)sk+0.5;(6)确定映射对应关系:rksk;(7)统计新直方图各灰度级像素nk;(8)用pk (sk) =nk/N计算新直方图。 利用Visual C+中提供的MFC框架设计一个简单的应用程序框架,具有图像显示,图像直方图均衡、直方图规定化、直方图、直方图均衡后图像等菜单栏,再利用C+具有面向对象程序设计的性质,编写程序代码实现MFC框架中对应菜单栏中的图像处理的功能,即可得到一个简易的图像处

10、理系统,达到课程考核题目的要求。 本次课程考核设计了一个简单的图片处理系统,主要具有以对话框的形式显示原始图片(bmp格式)、显示原图像的直方图、图像直方图均衡化、图像直方图规定化、显示均衡化和规定化处理后的直方图的功能2、类声明与核心算法程序代码void CBitmapView:OnPointEqua() / 灰度均衡/ 获取文档CBitmapDoc* pDoc = GetDocument();/ 指向DIB的指针LPSTRlpDIB;/ 指向DIB象素指针LPSTR lpDIBBits;/ 锁定DIBlpDIB = (LPSTR) :GlobalLock(HGLOBAL) pDoc-Get

11、HDIB();/ 找到DIB图像象素起始位置lpDIBBits = :FindDIBBits(lpDIB);/ 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的直方图均衡,其它的可以类推)if (:DIBNumColors(lpDIB) != 256)/ 提示用户MessageBox(目前只支持256色位图的直方图均衡!, 系统提示 , MB_ICONINFORMATION | MB_OK);/ 解除锁定:GlobalUnlock(HGLOBAL) pDoc-GetHDIB();/ 返回return;/ 更改光标形状BeginWaitCursor();/ 调用InteEquali

12、ze()函数进行直方图均衡InteEqualize(lpDIBBits, :DIBWidth(lpDIB), :DIBHeight(lpDIB);/ 设置脏标记pDoc-SetModifiedFlag(TRUE);/ 更新视图pDoc-UpdateAllViews(NULL);/ 解除锁定:GlobalUnlock(HGLOBAL) pDoc-GetHDIB();/ 恢复光标EndWaitCursor();* 函数名称: * InteEqualize() * * 参数: * LPSTR lpDIBBits - 指向源DIB图像指针 * LONG lWidth - 源图像宽度(象素数) * LO

13、NG lHeight - 源图像高度(象素数) * * 返回值: * BOOL - 成功返回TRUE,否则返回FALSE。 * * 说明: * 该函数用来对图像进行直方图均衡。*/BOOL WINAPI InteEqualize(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)/ 指向源图像的指针unsigned char*lpSrc;/ 临时变量LONGlTemp; / 循环变量LONGi;LONGj; / 灰度映射表BYTEbMap256; / 灰度映射表LONGlCount256; / 图像每行的字节数LONGlLineBytes; / 计算图像每行

14、的字节数lLineBytes = WIDTHBYTES(lWidth * 8); / 重置计数为0for (i = 0; i 256; i +)/ 清零lCounti = 0;/ 计算各个灰度值的计数for (i = 0; i lHeight; i +)for (j = 0; j lWidth; j +)lpSrc = (unsigned char *)lpDIBBits + lLineBytes * i + j;/ 计数加1lCount*(lpSrc)+;/ 计算灰度映射表for (i = 0; i 256; i+)/ 初始为0lTemp = 0;for (j = 0; j = i ; j+

15、)lTemp += lCountj; / 计算对应的新灰度值bMapi = (BYTE) (lTemp * 255 / lHeight / lWidth);/ 每行for(i = 0; i lHeight; i+)/ 每列for(j = 0; j right-(lpRect)-left)#define RECTHEIGHT(lpRect) (lpRect)-bottom-(lpRect)-top)#define WIDTHBYTES(bits) (bits)+31)/32*4)#define DIB_HEADER_MARKER (WORD)(MbiClrUsed;if(dwClrUsed)re

16、turn (WORD)dwClrUsed;if(IS_WIN30_DIB(lpbi) wBitCount=(LPBITMAPINFOHEADER)lpbi)-biBitCount;elsewBitCount=(LPBITMAPCOREHEADER)lpbi)-bcBitCount;switch(wBitCount)case 1:return 2;case 4:return 16;case 8:return 256;default:return 0;WORD WINAPI PaletteSize(LPSTR lpbi)if(IS_WIN30_DIB(lpbi)return (WORD)(DIBN

17、umColors(lpbi)*sizeof(RGBQUAD);elsereturn (WORD)(DIBNumColors(lpbi)*sizeof(RGBTRIPLE);LPSTR WINAPI FindDIBBits(LPSTR lpbi)return (lpbi+*(LPDWORD)lpbi+:PaletteSize(lpbi);DWORD WINAPI DIBWidth(LPSTR lpDIB)LPBITMAPINFOHEADER lpbmi;LPBITMAPCOREHEADER lpbmc;lpbmi=(LPBITMAPINFOHEADER)lpDIB;lpbmc=(LPBITMAP

18、COREHEADER)lpDIB;if(IS_WIN30_DIB(lpDIB)return lpbmi-biWidth;elsereturn (DWORD)lpbmc-bcWidth;DWORD WINAPI DIBHeight(LPSTR lpDIB)LPBITMAPINFOHEADER lpbmi;LPBITMAPCOREHEADER lpbmc;lpbmi=(LPBITMAPINFOHEADER)lpDIB;lpbmc=(LPBITMAPCOREHEADER)lpDIB;if(IS_WIN30_DIB(lpDIB)return lpbmi-biHeight;elsereturn (DWO

19、RD)lpbmc-bcHeight;BOOL WINAPI PaintDIB(HDC hDC,LPRECT lpDCRect,HDIB hDIB,LPRECT lpDIBRect,CPalette* pPal)LPSTR lpDIBHdr;LPSTR lpDIBBits;BOOL bSuccess=FALSE;HPALETTE hPal=NULL;HPALETTE hOldPal=NULL;if(hDIB=NULL)return FALSE;lpDIBHdr=(LPSTR):GlobalLock(HGLOBAL)hDIB);lpDIBBits=FindDIBBits(lpDIBHdr);if(

20、pPal!=NULL)hPal=(HPALETTE)pPal-m_hObject;hOldPal=:SelectPalette(hDC,hPal,TRUE);:SetStretchBltMode(hDC,COLORONCOLOR); if(RECTWIDTH(lpDCRect)=RECTWIDTH(lpDIBRect)&(RECTHEIGHT(lpDCRect)=RECTHEIGHT(lpDIBRect)bSuccess=:SetDIBitsToDevice(hDC,lpDCRect-left,lpDCRect-top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRe

21、ct),lpDIBRect-left,(int)DIBHeight(lpDIBHdr)-lpDIBRect-top-RECTHEIGHT(lpDIBRect),0,(WORD)DIBHeight(lpDIBHdr),lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS);elsebSuccess=:StretchDIBits(hDC,lpDCRect-left,lpDCRect-top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),lpDIBRect-left,lpDIBRect-top,RECTWIDTH(lpDI

22、BRect),RECTHEIGHT(lpDIBRect),lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS,SRCCOPY);:GlobalUnlock(HGLOBAL)hDIB);if(hOldPal):SelectPalette(hDC,hOldPal,TRUE);GlobalUnlock(hDIB);return bSuccess;BOOL WINAPI CreateDIBPalette(HDIB hDIB,CPalette* pPal)LPLOGPALETTE lpPal;HANDLE hLogPal;HPALETTE hPal=NULL;

23、LPSTR lpbi;LPBITMAPINFO lpbmi;LPBITMAPCOREINFO lpbmc;BOOL bWinStyleDIB;int i;WORD wNumColors;BOOL bResult=FALSE;if(hDIB=NULL)return FALSE; lpbi=(LPSTR):GlobalLock(HGLOBAL)hDIB);lpbmi=(LPBITMAPINFO)lpbi;lpbmc=(LPBITMAPCOREINFO)lpbi;wNumColors=DIBNumColors(lpbi);bWinStyleDIB=IS_WIN30_DIB(lpbi);if(wNum

24、Colors!=0)hLogPal=:GlobalAlloc(GHND,sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*wNumColors);if(hLogPal=0):GlobalUnlock(HGLOBAL)hDIB);return FALSE;lpPal=(LPLOGPALETTE):GlobalLock(hLogPal);lpPal-palVersion=PALVERSION;lpPal-palNumEntries=(WORD)wNumColors;bWinStyleDIB=IS_WIN30_DIB(lpbi);for(i=0;ipalPalEntry

25、i.peRed=lpbmi-bmiColorsi.rgbRed;lpPal-palPalEntryi.peGreen=lpbmi-bmiColorsi.rgbGreen;lpPal-palPalEntryi.peBlue=lpbmi-bmiColorsi.rgbBlue;lpPal-palPalEntryi.peFlags=0;elselpPal-palPalEntryi.peRed=lpbmc-bmciColorsi.rgbtRed;lpPal-palPalEntryi.peGreen=lpbmc-bmciColorsi.rgbtGreen;lpPal-palPalEntryi.peBlue

26、=lpbmc-bmciColorsi.rgbtBlue;lpPal-palPalEntryi.peFlags=0;bResult=pPal-CreatePalette(lpPal);:GlobalUnlock(HGLOBAL)hLogPal);:GlobalFree(HGLOBAL)hLogPal);:GlobalUnlock(HGLOBAL)hDIB);return bResult;HGLOBAL WINAPI CopyHandle(HGLOBAL h)if(h=NULL)return NULL;DWORD dwLen=:GlobalSize(HGLOBAL)h);HGLOBAL hCopy

27、=:GlobalAlloc(GHND,dwLen);if(hCopy!=NULL)void* lpCopy=:GlobalLock(HGLOBAL)hCopy);void* lp=:GlobalLock(HGLOBAL)h);memcpy(lpCopy,lp,dwLen);:GlobalUnlock(hCopy);:GlobalUnlock(h);return hCopy;BOOL WINAPI SaveDIB(HDIB hDib,CFile& file)BITMAPFILEHEADER bmfHdr;LPBITMAPINFOHEADER lpBI;DWORD dwDIBSize;if(!hD

28、ib)return FALSE;lpBI=(LPBITMAPINFOHEADER):GlobalLock(HGLOBAL)hDib);if(lpBI=NULL)return FALSE; if(!IS_WIN30_DIB(lpBI):GlobalUnlock(HGLOBAL)hDib);return FALSE;bmfHdr.bfType=DIB_HEADER_MARKER;dwDIBSize=*(LPDWORD)lpBI+:PaletteSize(LPSTR)lpBI);if(lpBI-biCompression=BI_RLE8)|(lpBI-biCompression=BI_RLE4)dw

29、DIBSize+=lpBI-biSizeImage;elseDWORD dwBmBitsSize;dwBmBitsSize=WIDTHBYTES(lpBI-biWidth)*(DWORD)lpBI-biBitCount)*lpBI-biHeight;dwDIBSize+=dwBmBitsSize;lpBI-biSizeImage=dwBmBitsSize;bmfHdr.bfSize=dwDIBSize+sizeof(BITMAPFILEHEADER);bmfHdr.bfReserved1=0;bmfHdr.bfReserved2=0;bmfHdr.bfOffBits=(DWORD)sizeof

30、(BITMAPFILEHEADER)+lpBI-biSize+:PaletteSize(LPSTR)lpBI);TRYfile.Write(LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER);file.WriteHuge(lpBI,dwDIBSize);CATCH(CFileException,e):GlobalUnlock(HGLOBAL)hDib);THROW_LAST();END_CATCH:GlobalUnlock(HGLOBAL)hDib);return TRUE;HDIB WINAPI ReadDIBFile(CFile& file)BITMAPFILEH

31、EADER bmfHeader;DWORD dwBitsSize;HDIB hDIB; LPSTR pDIB; dwBitsSize=file.GetLength(); if(file.Read(LPSTR)&bmfHeader,sizeof(bmfHeader)!=sizeof(bmfHeader)return NULL;if(bmfHeader.bfType!=DIB_HEADER_MARKER)return NULL;hDIB=(HDIB):GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,dwBitsSize);if(hDIB=0)return NULL;

32、pDIB=(LPSTR):GlobalLock(HGLOBAL)hDIB);if(file.ReadHuge(pDIB,dwBitsSize-sizeof(BITMAPFILEHEADER)!=dwBitsSize-sizeof(BITMAPFILEHEADER):GlobalUnlock(HGLOBAL)hDIB);:GlobalFree(HGLOBAL)hDIB);return NULL;:GlobalUnlock(HGLOBAL)hDIB);return hDIB;/在此处输入自己的函数定义上面是DIBAPI.h头文件中声明的函数的定义,你将自己的函数定义加到“/在此处输入自己的函数定义

33、”后面。下面加相应的消息映射函数,点Ctrl+W键,会出现MFC ClassWizard对话框,点Message Maps,在Class name下面的框中选择CMy111Doc,在Messages里面选中OnOpenDocument,然后点击Add Function按钮就加入了相应的消息映射函数,同样的方法以此加入OnSaveDocument、DeleteContents、CanCloseFrame相应的消息函数,点“确定”即可。点开111Doc.cpp文件,里面有相应的消息映射函数定义位置,在函数CMy111Doc:CMy111Doc()里输入以下代码:m_refColorBKG=0x00

34、808080;m_hDIB=NULL;m_palDIB=NULL;m_sizeDoc=CSize(1,1);在函数CMy111Doc:CMy111Doc()里输入以下代码:if(m_hDIB!=NULL):GlobalFree(HGLOBAL)m_hDIB);if(m_palDIB!=NULL)delete m_palDIB;在函数BOOL CMy111Doc:OnOpenDocument(LPCTSTR lpszPathName)里/ TODO: Add your specialized creation code here下面添加如下代码:CFile file;CFileException

35、 fe;if(!file.Open(lpszPathName,CFile:modeRead|CFile:shareDenyWrite,&fe)ReportSaveLoadException(lpszPathName,&fe,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);return FALSE;DeleteContents();BeginWaitCursor();TRYm_hDIB=:ReadDIBFile(file);CATCH(CFileException,eLoad)file.Abort();EndWaitCursor();ReportSaveLoadExcepti

36、on(lpszPathName,eLoad,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);m_hDIB=NULL;return FALSE;END_CATCHInitDIBData();EndWaitCursor();if(m_hDIB=NULL)CString strMsg;strMsg=读取图像时出错!可能是不支持该类型的图像文件!;MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);return FALSE;SetPathName(lpszPathName);SetModifiedFlag(FALSE);在函数

37、BOOL CMy111Doc:OnSaveDocument(LPCTSTR lpszPathName)里/ TODO: Add your specialized code here and/or call the base class后面添加如下代码:CFile file;CFileException fe;if(!file.Open(lpszPathName,CFile:modeCreate|CFile:modeReadWrite|CFile:shareExclusive,&fe)ReportSaveLoadException(lpszPathName,&fe,TRUE,AFX_IDP_IN

38、VALID_FILENAME);return FALSE;BOOL bSuccess=FALSE;TRYBeginWaitCursor();bSuccess=:SaveDIB(m_hDIB,file);file.Close();CATCH(CException,eSave)file.Abort();EndWaitCursor();ReportSaveLoadException(lpszPathName,eSave,TRUE,AFX_IDP_FAILED_TO_SAVE_DOC);return FALSE;END_CATCHEndWaitCursor();SetModifiedFlag(FALS

39、E);if(!bSuccess)CString strMsg;strMsg=无法保存BMP图像;MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);点开ClassView,右键点击CMy111Doc类,点Add Member Variable出现添加成员变量对话框,在Variable Type下的框中输入变量类型名HDIB,在Variable Name中输入变量名m_hDIB,在Access中选中Public就在CMy111Doc中加入了公共成员变量m_hDIB;同样加入int类型的m_nColorIndex、COLORREF类型的m_r

40、efColorBKG公共成员变量,再添加保护成员变量(在Access中选中Protected)CSize类的m_sizeDoc、CPalette*类的m_palDIB变量。右键点击CMy111Doc类,点Add Member Function出现添加成员函数对话框,在Function Type下的框中输入函数类型名void,在Function Declaration中输入函数名InitDIBData(),在Access中选中Public就在CMy111Doc中加入了公共成员函数InitDIBData();同样方法加入void类型的公共成员函数ReplaceHDIB(HDIB hDIB)。在11

41、1Doc.cpp中加入函数的代码,InitDIBData()里加如下代码:if(m_palDIB!=NULL)delete m_palDIB;m_palDIB=NULL;if(m_hDIB=NULL)return;LPSTR lpDIB=(LPSTR):GlobalLock(HGLOBAL)m_hDIB);if(:DIBWidth(lpDIB)INT_MAX|:DIBHeight(lpDIB)INT_MAX):GlobalUnlock(HGLOBAL)m_hDIB);:GlobalFree(HGLOBAL)m_hDIB);m_hDIB=NULL;CString strMsg;strMsg=BM

42、P图像太大!;MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);return;m_sizeDoc=CSize(int):DIBWidth(lpDIB),(int):DIBHeight(lpDIB);:GlobalUnlock(HGLOBAL)m_hDIB);m_palDIB=new CPalette;if(m_palDIB=NULL):GlobalFree(HGLOBAL)m_hDIB);m_hDIB=NULL;return;if(:CreateDIBPalette(m_hDIB,m_palDIB)=NULL)delete m_palD

43、IB;m_palDIB=NULL;return;在函数ReplaceHDIB(HDIB hDIB)中加入如下代码:if(m_hDIB!=NULL):GlobalFree(HGLOBAL)m_hDIB);m_hDIB=hDIB;在CMy111doc.h的/ Attributespublic:下面加入如下代码:HDIB GetHDIB() constreturn m_hDIB;CPalette* GetDocPalette() constreturn m_palDIB;CSize GetDocSize() constreturn m_sizeDoc;注意要在111Doc.h前加上#include

44、DIBAPI.h语句(在class CMy111Doc:public CDocument语句前)下面为CMy111View中的函数 void CMy111View:OnDraw(CDC* pDC)中添加如下代码:BeginWaitCursor();CMy111* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereHDIB hDIB=pDoc-GetHDIB();if(hDIB!=NULL)LPSTR lpDIB=(LPSTR):GlobalLock(HGLOBAL)hDIB);in

45、t cxDIB=(int):DIBWidth(lpDIB);int cyDIB=(int):DIBHeight(lpDIB);:GlobalUnlock(HGLOBAL)hDIB);CRect rcDIB;rcDIB.top=rcDIB.left=0;rcDIB.right=cxDIB;rcDIB.bottom=cyDIB;CRect rcDest;if(pDC-IsPrinting()int cxPage=pDC-GetDeviceCaps(HORZRES);int cyPage=pDC-GetDeviceCaps(VERTRES);int cxInch=pDC-GetDeviceCaps(

46、LOGPIXELSX);int cyInch=pDC-GetDeviceCaps(LOGPIXELSY);rcDest.top=rcDest.left=0;rcDest.bottom=(int)(double)cyDIB*cxPage*cyInch)/(double)cxDIB*cxInch);rcDest.right=cxPage;int temp=cyPage-(rcDest.bottom-rcDest.top);rcDest.bottom+=temp/2;rcDest.top+=temp/2;elsercDest=rcDIB;:PaintDIB(pDC-m_hDC,&rcDest,pDo

47、c-GetHDIB(),&rcDIB,pDoc-GetDocPalette();EndWaitCursor();以上是关于图像打开、显示、保存的有关步骤和代码。在111.cpp文件的InitInstance()函数的ParseCommandLine(cmdInfo);语句下输入语句cmdInfo.m_nShellCommand = CCommandLineInfo:FileNothing;则启动时不自动打开一个空文档。显示图像直方图步骤:1、 点击ResourceView,右键点击Dialog,选Insert Dialog 在属性对话框中将ID改为ID_HIST,对话框名称改为“直方图”2、

48、在工具栏中点“插入”“新建类”,输入类名HAHA,并选Base Class为CDialog,Dialog ID为ID_HIST。这样就将对话框和类联系起来了,在该对话框中拖入一Edit控件,将其ID设为IDC_HISTSHOW;3、 快捷键“CtrlW”,出现MFC ClassWizard对话框,在Messages栏中分别选WM_INITDIALOG和WM_Paint,再点击“Add Function”,即将对话框初始化和画图函数加入对话框类之中。4、 在Hist.h文件“public:”下面输入如下变量定义:(HAHA)LONG m_lCount256;char* m_lpDIBBits;LONG m_

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!