




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,图像的存取、显示与生成,2,4.1.3 CImage类(1),CImage是Visual C+中MFC的一个类 CImage类使图形、图像软件的开发跨越了DDB与DIB概念,使处理更为简洁、方便 CImage类提供了读入和保存BMP、JPEG、GIF、TIF与PNG等格式图像的能力 CImage可以直接使用Windows提供的图形功能,3,4.1.3 CImage类(2),使用CImage时,必须包含atlimage.h文件。可在stdafx.h文件的末尾添加#include .,4,CImage类成员函数创建与删除,Create 创建一个DIB位图与已有CImage对象相连接 Destroy 位图与CImage对象相分离并予删除,5,CImage类成员函数输入与输出,Load 读入指定图像文件中的图像 Save 按指定类型保存图像,文件名中不能省略后缀,6,CImage类成员函数位图参数,GetWidth 返回当前图像的宽度(以像素为单位) GetHeight 返回当前图像的高度 GetBPP 返回当前图像的每像素位数(颜色的深度) GetPixelAddress 返回指定像素数据存放位置的存储地址 GetMaxColorTableEntries 返回调色板单元数 IsIndexed 判别位图中是否有调色板,7,CImage类成员函数图形绘制,GetDC 返回当前位图的设备描述表 ReleaseDC 释放设备描述表 GetPixel 返回指定位置像素的颜色 SetPixel 设置指定位置像素的颜色 SetPixelRGB 设置指定位置像素的红绿蓝分量 GetColorTable 获取调色板颜色分量 (红、绿、蓝) 值 SetColorTable 设置调色板颜色分量 (红、绿、蓝) 值,8,CImage类成员函数位图块传送,BitBlt 位图的一个矩形区域复制到另一位图上的指定区域 StretchBlt 从源矩形拷贝到目标矩形,支持伸缩,9,4.1.5 图像文件的输入与输出,CImage类读入图象数据的成员函数: HRESULT Load( LPCTSTR pszFileName ) throw( ); 例如:WorkCanvus.Load(m_FileName); CImage类保存图象数据的成员函数: HRESULT Save( IStream* pStream, REFGUID guidFileType ) const throw();,10,读入图象文件并显示图象的步骤,(1)建立CImage对象,例如WorkCanvus (2)在“打开文件”菜单处理程序OnFileOpen()函数中用WorkCanvus的Load()成员函数将图像文件里的图象数据读入到WorkCanvus中 (3)在菜单“显示工作画布”处理程序OnDisplayWorkcanvus()中用WorkCanvus的Bitblt()函数将WorkCanvus中的图象数据传送到画布(例如CClientDC或pDC)上,WorkCanvus,图像文件,Load(),Bitblt(),画布,11,打开图像文件-OnFileOpen(),菜单: “文件/打开” 源文件:CImageDoc.cpp 函数:OnFileOpen() 步骤: (1)添加CImage类的全局对象WorkCanvus,并在stdafx.h中将WorkCanvus说明为外部对象 extern CImage WorkCanvus; (2)添加CImageDoc类的事件ID_FILE_OPEN的处理函数 void CImageDoc:OnFileOpen() (3)在CImageDoc:OnFileOpen()函数中编写程序 由对话框输入图像文件名 根据文件名从图像文件中读入图像数据到CImage类的对象WorkCanvus中 并设置最近打开的文件名,12,Program CImageDoc.cpp OnFileOpen(),void CImageDoc:OnFileOpen() 。 CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter); hResult = (int)dlg.DoModal();/由对话框输入图像文件名 m_FileName = dlg.GetFileName();/保存当前文件名 hResult = WorkCanvus.Load(m_FileName);/根据文件名从图像文件中读入图像数据到CImage类的对象WorkCanvus中 SetPathName(m_FileName,1);/设置最近打开的文件名 UpdateAllViews(NULL); /调用OnDraw显示图象 ,13,保存图像文件(1),菜单: “文件/另存为” 源文件:CImageDoc.cpp 函数:OnFileSaveAs() 步骤: (1)添加CImageDoc类的事件ID_FILE_SAVE_AS的处理函数void CImageDoc:OnFileSaveAs() (3)在CImageDoc: OnFileSaveAs()函数中编写程序: 由对话框输入图像文件名 根据文件名将CImage类的对象WorkCanvus中的图像数据保存到图像文件中去,14,保存图像文件(2),void CImageDoc:OnFileSaveAs() CFileDialog dlg(FALSE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER,strFilter); hResult = (int)dlg.DoModal();/ 由对话框输入文件名 hResult = WorkCanvus.Save(strFileName); ,15,显示CImage类对象中的图象,菜单: “画布操作/显示工作画布” 源文件:CImageView.cpp 函数:OnDisplayWorkcanvus() void DrawWorkCanvus(CDC *pDC) CClientDC dc(this); int nXDest,nYDest,nWidth,nHeight,nXSrc,nYSrc; nXSrc=0; nYSrc=0; nXDest=0; nYDest=0; nWidth=WorkCanvus.GetWidth(); nHeight=WorkCanvus.GetHeight(); WorkCanvus.BitBlt(dc,nXDest,nYDest,nWidth,nHeight,nXSrc,nYSrc,SRCCOPY); ,16,4.2 画布,画布是一个将图像作为二维像素数组存储的数据结构 屏幕画布 屏幕上Windows窗口中的客户区 可通过新建CClientDC的对象来创建屏幕画布 利用OnDraw()函数中的参数pDC来创建屏幕画布 内存画布 建立一个或多个CImage对象来创建内存画布 画布可用作双缓存技术 克服屏幕画面的闪烁,17,4.2.1-2 CImage对象的创建,BOOL Create(int nWidth, int nHeight,int nBPP,DWORD dwFlags=0)throw(); nWidth The width of the CImage bitmap, in pixels. nHeight The height of the CImage bitmap, in pixels. If nHeight is positive, the bitmap is a bottom-up DIB and its origin is the lower left corner. If nHeight is negative, the bitmap is a top-down DIB and its origin is the upper left corner. nBPP The numbers of bits per pixel in the bitmap. Usually 4, 8, 16, 24, or 32. Can be 1 for monochrome bitmaps or masks. dwFlags Specifies if the bitmap object has an alpha channel. Can be a combination of zero or more of the following values:,18,4.2.1-3 CImage对象转换成CDC对象,CDC中有大量绘图函数,那么如何用CDC类的成员函数在CImage对象上绘图? 从CImage对象取得HDC设备描述表,再转换成CDC对象, 例如 CImage WorkCanvus; CDC *pDC; pDC=CDC:FromHandle(WorkCanvus.GetDC();/获取CDC指针 pDC-SetPixel(x,y,(COLORREF) n); /CDC上的各种绘图操作 WorkCanvus.ReleaseDC(); / 释放HDC,19,4.2.2 窗口刷新,Windows通过调用OnDraw()函数刷新窗口 何时需要刷新窗口? 系统需要,例如系统改变窗口的尺寸 程序需要,例如程序要重画,可调用Invalidate()使窗口失效Invalidate()可以使整个窗口失效进行重绘,也可定义一个矩形区域只使一个区域内部某些地方失效 刷新时全部清除失效区域后,再重新开始绘制新的画面,故在执行过程中会看到屏幕有一次闪动 刷新窗口的方法 重新绘制,即将形成当前图像画面的过程再重复一遍 备份复贴,即将当前的屏幕画面存储起来作为备份,刷新时将备份粘贴到屏幕上,20,4.2.3 演示程序中一些画布的设置,工作画布-用于存放需要进行处理的图像 CImage对象,名为WorkCanvus 副本画布-保存图像,必要时把副本画布恢复到工作画布中去 CImage对象,名为SaveCanvus 屏幕画布-即屏幕窗口 CClientDC的对象,例如dc CDC类的指针,例如pDC,WorkCanvus,SaveCanvus,屏幕画布,21,4.3.1-4 位图的复制,CImage类对象之间的复制功能不可以用赋值来实现。因此,编写了CopyImage()函数来实现两个CImage对象间数据的复制 菜单: “画布操作/工作画布复制到副本画布” 源文件:第四章图象显示.cpp 函数:CopyImage(),22,void CopyImage(CImage *pNewImg,CImage *pImage) RGBQUAD ColorTabs256; BYTE *pPixels, *pNewPixels; CDC *pDC,*pNewDC; nWidth=pImage-GetWidth(); nHeight=pImage-GetHeight(); nBitsPerPixel=pImage-GetBPP(); nColorTableEntries=pImage-GetMaxColorTableEntries(); if(!pNewImage-IsNull() pNewImage-Destroy(); pNewImage-Create(nWidth,nHeight,nBitsPerPixel,0); if (nColorTableEntries0) pImage-GetColorTable(0,nColorTableEntries,ColorTabs); pNewImage-SetColorTable(0,nColorTableEntries,ColorTabs); pDC= CDC:FromHandle(pImage-GetDC(); pNewDC = CDC:FromHandle(pNewImage-GetDC(); pNewDC-BitBlt(0,0,nWidth,nHeight,pDC,0,0,SRCCOPY); pImage-ReleaseDC(); pNewImage-ReleaseDC(); ,23,像素的整行复制,为了能快速复制这些像素数据,可使用内存拷贝函数memcpy来复制像素 void *memcpy( void *dest, const void *src, size_t count ); dest New buffer src Buffer to copy from count Number of characters to copy 例如:将第y1行像素数据整行复制到y2行 nBytesPerLine=GetBytesPerLine(pImage);/整行像素数据字节数 pPixel = (BYTE*) pImage-GetPixelAddress(0,y1); pNewPixel = (BYTE*) pNewImage-GetPixelAddress(0,y2); memcpy(pNewPixel,pPixel,nBytesPerLine); pPixel 是y1行像素数据的首地址 pNewPixel 是y2行像素数据的首地址,24,4.4.4 改变调色板,灰阶调色板,蓝阶调色板,默认调色板,25,灰阶调色板,调色板单元各分量的强度相等,色彩呈现灰色,分量值与单元序号成正比,调色板,内存图象数据,图象显示颜色,26,设置灰阶调色板,源文件:第四章图象显示.cpp 函数:OnSetGrayPalette() void CImageView:OnSetGrayPalette() RGBQUAD ColorTab; . for(int i=0;i256;i+)/设置灰阶调色板 ColorTab.rgbRed = i; ColorTab.rgbGreen = i; ColorTab.rgbBlue = i; SaveCanvus.SetColorTable(i, 1, . ,27,蓝阶调色板,与灰阶调色板相似,它只保留蓝分量,而将红、绿分量全部设置为0,调色板,内存图象数据,图象显示颜色,28,设置蓝阶调色板,源文件:第四章图象显示.cpp 函数:OnSetBluePalette() void CImageView:OnGrayPalette() RGBQUAD ColorTab; . for(int i=0;i256;i+)/设置灰阶调色板 ColorTab.rgbRed = 0; ColorTab.rgbGreen = 0; ColorTab.rgbBlue = i; SaveCanvus.SetColorTable(i, 1, . ,29,默认调色板(1),自定义了一个默认调色板,提供一组典型的颜色组合,调色板,内存图象数据,图象显示颜色,30,默认调色板(2),RGBQUAD DefaultPalette256 = 0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0xa8,0x00,0x00, 0xa8,0xa8,0x00,0x00,0x00,0x00,0xa8,0x00,0xa8,0x00,0xa8,0x00, 0x00,0x54,0xa8,0x00,0xa8,0xa8,0xa8,0x00,0x54,0x54,0x54,0x00, 0xfc,0x54,0x54,0x00,0x54,0xfc,0x54,0x00,0xfc,0xfc,0x54,0x0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 甲乙酮装置操作工基础技能培训手册
- 列尾作业员安全教育培训手册
- 内墙腻子粉检测报告
- 配电网设备运维员公司招聘笔试题库及答案
- 2025年中国波纹管市场深度评估及行业投资前景咨询报告
- 锑酸钠项目可行性研究报告范文参考
- 烷基苯装置操作工理论学习手册练习试题及答案
- 高温焰流烧蚀试验工公司招聘笔试题库及答案
- 2025年建筑节能市场调研报告
- 印花色浆配制操作工岗位实习报告
- 灯具代加工制作合同范本
- 2025年5月24日福建省税务遴选笔试真题及解析
- 2025重庆市船舶检验中心有限公司招聘3人笔试历年参考题库附带答案详解
- 2024金山职业技术学院辅导员招聘笔试真题
- 教育部幼儿园督导评估
- 四川省国企代建管理办法
- 2025山东枣庄翼云机场招聘110人笔试参考题库附带答案详解版
- 铁道机车总体考试题库及答案
- 家庭教育健康讲座:做智慧父母育幸福孩子
- 2024-2025学年鲁教版八年级数学下学期期末模拟卷(全解全析)
- 2024-2025学年北京版八年级数学下学期期末模拟卷(含答案)
评论
0/150
提交评论