C程序设计图片处理.doc_第1页
C程序设计图片处理.doc_第2页
C程序设计图片处理.doc_第3页
C程序设计图片处理.doc_第4页
C程序设计图片处理.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+ 程序设计 课程论文 学 部 信息科学与技术 专 业 光电信息工程 班 级 * 学 号 * 学生姓名 * 指导教师 * 课程成绩 完成日期 * 目录1 引言- 1 -1.1 C+介绍- 1 -1.2图片处理的介绍- 2 -(1)运行程序- 2 -(2)打开BMP格式文件的图片- 2 -(3)查看像素- 3 -(4)灰度图像- 3 -(5)查看对话框各点的坐标- 4 -2程序的实现- 4 -2.1导入CDib工具类函数- 4 -(1)CDib简介- 4 -(2)向库中添加 CDib- 6 -(3)导入CDib类- 6 -2.2打开文件函数- 6 -2.3查询像素函数- 7 -(1)虚拟按键查询- 7 -(2)菜单“check”像素- 8 -2.4显示对话框坐标- 8 -3心得体会- 9 -4 参考文献- 10 -5 程序代码(部分)- 10 -用C编写图片处理程序学生:* 指导老师:*搞 要 本课程设计是在基于MFC对话框的应用程序中编写一个简单的图片处理程序,其功能包括:打开格式BMP的文件,查询像素与鼠标在对话框的位置坐标。系统开发平台为Windows XP/7,程序设计设计语言采用Visual C+6.0,程序运行平台为Windows 98/2000/XP。程序通过调试运行,初步实现了设计目标。关键词 图片处理;灰度图像;C+;1 引言 在现代社会中,每天我们都要处理大量的图片信息,因此作为一名光电信息工程的学生,学习图片处理已经成为我们必备的基本技能。无论是在光学课程设计中,还是从事光学仪器研发,都需要有良好的图片信息处理的能力。1.1 C+介绍C+语言的主要特点表现在两个方面,一是全面兼容C语言,二是支持面向对象的程序设计方法。(1) C+是一个更好的C,它保持了C语言的优点,大多数的C程序代码略作修改或不作修改就可在C+的集成环境下调试和运行。这对于继承和开发当前已在广泛的软件是非常重要的,可以节省大量的人力和物力。(2) C+是一种面向对象的程序设计语言它使得程序的各个模块的独立性更强,程序的可读性和可移植性更强,程序代码的结构更加合理,程序的扩充性更强。这对于设计、编制和调试一些大型的软件尤为重要。 (3) C+集成环境不仅支持C+程序的编译和调试,而且也支持C程序的编译和调试。通常,C+程序环境约定:当源程序文件的扩展名为c时,则为C程序;而当源程序文件的扩展名为cpp时,则为C+程序。(4) C+语句非常简练,对语法限制比较宽松,因此C+语法非常灵活。其优点是给用户编程带来书写上的方便。其缺点是由于编译时对语法限制比较宽松,许多逻辑上的错误不容易发现,给用户编程增加了难度。1.2图片处理的介绍(1)运行程序运行程序后系统会弹出一个工作界面,如下图所示:图1.1 操作界面(2)打开BMP格式文件的图片单击文件,再单击打开查找BMP格式文件的图片图1.2 “打开”命令(3)查看像素方法一:将鼠标移到图片区域,单击左键,会弹出一个对话框,显示当前位置点的像素图1.3 操作界面方法二:单击check,点击查看像素,将鼠标移动到图片区域,对话框显示栏中实时显示当前鼠标所在点的像素。图1.4 操作界面(4)灰度图像灰度图像(gray image)是每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑色与白色两种颜色;但是,灰度图像在黑色与白色之间还有许多级的颜色深度。灰度图像经常是在单个电磁波频谱如可见光内测量每个像素的亮度得到的,用于显示的灰度图像通常用每个采样像素8位的非线性尺度来保存,这样可以有256级灰度(如果用16位,则有65536级)。(5)查看对话框各点的坐标将鼠标移动到对话框区域,显示栏中实时显示当前鼠标所在位置点的坐标,坐标系的原点位于工作区左上角边缘,水平向右为x轴正方向,竖直向下为y轴正方向,显示栏中显示的坐标为(x ,y)。 图1.5 “坐标”对话框 2程序的实现 2.1导入CDib工具类函数(1)CDib简介Visual C+ MFC中没有提供一个专门的类来处理DIB位图,因此,为了方便地使用位图文件,我们有必要派生一个CDib类。class CDib public:/构造函数CDib();/析构函数virtual CDib();private:/指向位图文件头BITMAPFILEHEADER *m_pBmfh;/指向位图信息头+调色板BYTE *m_pBmInfo;/指向位图的像素矩阵BYTE *m_pPixel;/指向位图的信息头BITMAPINFOHEADER *m_pBmih;public:/标识是否进行了读取操作BOOL m_bRead;public:/读入位图int Read(CString filename);/显示位图void Draw(CDC *pDC);/写出位图int Write(CString filename);public:/获得位图的宽度DWORD GetWidth() const;/获得位图的高度DWORD GetHeight() const;/获得位图的位数WORD GetBitCount() const;/获取每行像素所占的字节数DWORD GetLineBytes() const;/获得指向位图像素矩阵的指针BYTE* GetPixelPointer() const;/设置位图像素矩阵int SetPixelMatrix(BYTE *src);(2)向库中添加 CDib右键单击已有的CDib类,单击Add to Gallery,即将CDib导入库中。(3)导入CDib类打开“picture”程序,在顶层菜单,选择 “Project”-“Commponents and Controls”,弹出“ Components and Controls”,弹出“ Gallery”对话框,如图 2.1所示。双击“show”文件,选定Dib.ogx媒体文件,单击“Inset”。图2.1“坐标”对话框2.2打开文件函数在CpictureDoc添加一个成员函数OnFileOpen(),其程序代码如下:void CPictureDoc:OnFileOpen() CFileDialog fileOpenDlg(TRUE,bmp, *.bmp, NULL, Bitmap Files(*.bmp), NULL); int nRespond=fileOpenDlg.DoModal();if(nRespond=IDOK)CString filePath=fileOpenDlg.GetPathName(); m_pDib=new CDib(filePath);if(m_pDib-IsValid()SetTitle(filePath);elseDeleteContents();UpdateAllViews(0); 2.3查询像素函数(1)虚拟按键查询CWnd:OnLButtonDown该成员函数由框架调用,让应用程序处理一个Windows消息。参数传递给函数时,反映收到的消息框架收到的参数。如果调用此函数的基类的实现,该实现将使用原来的消息,而不是提供的参数传递给函数的参数。其程序代码如下:void CPictureView:OnLButtonDown(UINT nFlags, CPoint point) CString str;if(m_pDib!=NULL)int height, width;height=m_pDib-GetHeight();width=m_pDib-GetWidth();if(point.xwidth)&(point.yGetDibData();int x=*(pData+width*(height-1-point.y)+width);str.Format(%d,*(pData+width*(height-1-point.y)+point.x);MessageBox(str);CView:OnLButtonDown(nFlags, point);(2)菜单“check”像素若*bmp格式的图片已打开,则执行以下程序:void CPictureView:OnMenuCheck() if(NULL!=m_pDib)&(m_pDlg!=NULL)m_pDlg-ShowWindow(SW_SHOWNORMAL);else if(NULL!=m_pDib)&(m_pDlg=NULL)m_pDlg=new CShowDlg;m_pDlg-Create(IDD_DIALOG1);m_pDlg-ShowWindow(SW_SHOWNORMAL);else2.4显示对话框坐标OnMouseMove当鼠标移动时调用此函数时,参数nFlags指示各种虚拟按键是否按下,此参数可以是任何下列值的组合:MK_CONTROL 当CTRL键按下时。MK_LBUTTON 当鼠标左键按下时。MK_MBUTTON 当鼠标中键按下时。MK_RBUTTON 当鼠标右键按下时.MK_SHIFT 当SHIFT按下时。point :鼠标的X,Y坐标:该坐标为 鼠标距离截获该消息的窗口左上角的位置 是一个相对位置而不是在屏幕像素上的绝对位置。例如:当窗口的左上角坐标为(10,10)那么当鼠标在屏幕的(10,10)像素点的时候,OnMouseMove函数point值为(0,0)因为是相对窗口左上角的相对位置。其程序代码如下:void CPictureView:OnMouseMove(UINT nFlags, CPoint point) if(NULL!=m_pDlg)int height, width;height=m_pDib-GetHeight();width=m_pDib-GetWidth();if(point.xwidth)&(point.yGetDibData();int x=*(pData+width*(height-1-point.y)+width);m_pDlg-m_sShow.Format(%d,*(pData+width*(height-1-point.y)+width);m_pDlg-UpdateData(FALSE);CView:OnMouseMove(nFlags, point);3心得体会本次图片处理的程序编写,基本上是模仿老师的程序做下来的,里面有很多函数的意义与用法还不了解。copy老师的程序时,由于对函数本身并不了解,最初运行程序时经常报错,我再根据编译器的提示解决了一些语法问题,主要是没有定义变量和未加入头文件。但是有些逻辑问题编译器并不报错,如未在构造函数CPictureDoc:CPictureDoc()中初始化成员变量m_pDib,导致不能运行程序,当初始化“m_pDib=NULL;”程序就能正常运行了。在添加成员函数时,我都是对比着原有的程序中函数添加的,虽然最后程序能很好的实现相同的功能,但是整个过程对自己的提高不够。由于C+课时十分有限,而C+本身较难学习,通过这次学习,我仅了解了C+最基础的知识,如:定义构造函数与析构函数,区分变量的使用域以及少数的函数。不过这次学习进一步提高了我的自学能力,从最初提出问题,到收集、筛选相关信息,再到理解、使用相关知识来解决问题,在以后的学习中我还需要进一步学习相关知识。4 参考文献1谭浩强. C+程序设计.清华大学出版社2004.2孙鑫.Visual C+教程. .3杨有安.C+程序设计教程.人民邮电出版社2012.4陈维.大学计算机基础教程.人民邮电出版社2010.5 程序代码(部分)#include stdafx.h#include picture.h#include pictureDoc.h#include pictureView.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifCPictureView:CPictureView()/ TODO: add construction code herem_ReShow=false;m_pDib=NULL;m_pDlg=NULL;m_bOpen=false;CPictureView:CPictureView()BOOL CPictureView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs);void CPictureView:OnDraw(CDC* pDC)CPictureDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CDib* pDib=pDoc-m_pDib; if(pDib&m_ReShow!=true)m_pDib=pDoc-m_pDib;StretchDIBits(pDC-m_hDC,0,0,pDib-m_nWidth,pDib-m_nHeight,0,0,pDib-m_nWidth,pDib-m_nHeight,pDib-m_pDibData,pDib-m_pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);BOOL CPictureView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CPictureView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add cleanup after printing#ifdef _DEBUGvoid CPictureView:AssertValid() constCView:AssertValid();void CPictureView:Dump(CDumpContext& dc) constCView:Dump(dc);CPictureDoc* CPictureView:GetDocument() / non-debug version is inlineASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CPictureDoc);return (CPictureDoc*)m_pDocument;void CPictureView:OnLButtonDown(UINT nFlags, CPoint point) CString str;if(m_pDib!=NULL)int height, width;height=m_pDib-GetHeight();width=m_pDib-GetWidth();if(point.xwidth)&(point.yGetDibData();int x=*(pDa

温馨提示

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

评论

0/150

提交评论