《最新图像的读入和显示ppt课件.ppt》由会员分享,可在线阅读,更多相关《最新图像的读入和显示ppt课件.ppt(35页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、20:37:53冯筠:VC+图像编程ViewDIB 打开文件的例子打开文件的例子学习分隔视图创建方法(多文档多视图结构)学习分隔视图创建方法(多文档多视图结构)学习串行化读取文件的机制学习串行化读取文件的机制图像读取和显示的基本流程图像读取和显示的基本流程在了解基本概念的基础上(在了解基本概念的基础上(API),了解图像),了解图像类的设计方法类的设计方法学习的学习的MFC类:类:CFileCArchive学习一些内存读取的学习一些内存读取的API函数函数20:37:53冯筠:VC+图像编程自定义串行化对象类自定义串行化对象类从从CObject派生派生该类实现了该类实现了Serialize函数
2、函数该类在定义时使用了该类在定义时使用了DECLARE_SERIAL宏宏在类的实现文件中使用了在类的实现文件中使用了IMPLEMENT_SERIAL宏宏这个类有一个不带参数的构造函数,或者某一这个类有一个不带参数的构造函数,或者某一个带参数的构造函数所有的参数都提供了缺省个带参数的构造函数所有的参数都提供了缺省参数参数 20:37:53冯筠:VC+图像编程CDib 类类-图像类图像类20:37:53冯筠:VC+图像编程CDib的串行化函数的串行化函数20:37:53冯筠:VC+图像编程CDib 真正的读取函数真正的读取函数20:37:53冯筠:VC+图像编程图像类的基本结构图像类的基本结构先定
3、义一系列图像处理先定义一系列图像处理API函数函数C程序,包括读取,显示等等函数程序,包括读取,显示等等函数DibAPI.h DibAPI.cpp在在API之上,设计之上,设计CDib类类定义了图像数据相关的一些属性定义了图像数据相关的一些属性将图像处理和打开的函数封装到类中将图像处理和打开的函数封装到类中基本分类情况基本分类情况打开图像(图像格式(讨论),读取方式)打开图像(图像格式(讨论),读取方式)显示图像显示图像20:37:53冯筠:VC+图像编程图像文件的格式图像文件的格式主要介绍主要介绍BMP图像文件格式,并且文件里的图像图像文件格式,并且文件里的图像数据是未压缩的(数据是未压缩的
4、(2色,色,4色,色,16色,色,256色,色,24位真彩色)位真彩色)因为图像的数字化处理主要是对图像中的各个像因为图像的数字化处理主要是对图像中的各个像素进行相应的处理,而未压缩的素进行相应的处理,而未压缩的BMP图像中的像图像中的像素数值正好与实际要处理的数字图像相对应,这素数值正好与实际要处理的数字图像相对应,这种格式的文件最合适我们对之进行数字化处理。种格式的文件最合适我们对之进行数字化处理。压缩过的图像是无法直接进行数字化处理的,如压缩过的图像是无法直接进行数字化处理的,如JPEG、GIF等格式的文件,此时首先要对图像等格式的文件,此时首先要对图像文件解压缩,这就要涉及到一些比较复
5、杂的压缩文件解压缩,这就要涉及到一些比较复杂的压缩算法,本课程不涉及。算法,本课程不涉及。 20:37:53冯筠:VC+图像编程BMP文件格式文件格式文件头文件头(BITMAPFILEHEADER)主要包含文件的大小、文件类型、图像数据偏离文件头的长度等信主要包含文件的大小、文件类型、图像数据偏离文件头的长度等信息息位图信息头位图信息头(BITMAPINFOHEADER)包含图象的尺寸信息、图像用几个比特数值来表示一个像素、图像包含图象的尺寸信息、图像用几个比特数值来表示一个像素、图像是否压缩、图像所用的颜色数等信息是否压缩、图像所用的颜色数等信息颜色信息颜色信息(RGBQUAD)颜色信息包含
6、图像所用到的颜色表,显示图像时需用到这个颜色表颜色信息包含图像所用到的颜色表,显示图像时需用到这个颜色表来生成调色板,但如果图像为真彩色,即图像的每个像素用来生成调色板,但如果图像为真彩色,即图像的每个像素用24个比个比特来表示,文件中就没有这一块信息,也就不需要操作调色板特来表示,文件中就没有这一块信息,也就不需要操作调色板图形数据图形数据表示图像的相应的像素值,图像的像素值在文件中的存放顺序为从表示图像的相应的像素值,图像的像素值在文件中的存放顺序为从左到右,从下到上,文件存储图像的每一行像素值时,如果存储该左到右,从下到上,文件存储图像的每一行像素值时,如果存储该行像素值所占的字节数为行
7、像素值所占的字节数为4的倍数,则正常存储,否则,需要在后端的倍数,则正常存储,否则,需要在后端补补0,凑足,凑足4的倍数。的倍数。20:37:53冯筠:VC+图像编程图像格式:图像格式:BMP文件头文件头 BMP文件头数据结构含有文件头数据结构含有BMP文件的类型、文件大小文件的类型、文件大小和位图起始位置等信息。其结构定义如下和位图起始位置等信息。其结构定义如下: typedef struct tagBITMAPFILEHEADERWORD bfType; / 位图文件的类型,必须为位图文件的类型,必须为“BM”DWORD bfSize; / 位图文件的大小,以字节为单位位图文件的大小,以字
8、节为单位WORD bfReserved1; / 位图文件保留字,必须为位图文件保留字,必须为0WORD bfReserved2; / 位图文件保留字,必须为位图文件保留字,必须为0DWORD bfOffBits; / 位图数据的起始位置,以相对于位位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位图文件头的偏移量表示,以字节为单位 BITMAPFILEHEADER;该结构占据;该结构占据14个字节。个字节。20:37:53冯筠:VC+图像编程图像格式:位图信息头图像格式:位图信息头 BMP位图信息头数据用于说明位图的尺寸等位图信息头数据用于说明位图的尺寸等信息。其结构如下信息。其
9、结构如下:typedef struct tagBITMAPINFOHEADERDWORD biSize; / 本文件所占用字节数本文件所占用字节数LONG biWidth; / 位图的宽度,以像素为单位位图的宽度,以像素为单位LONG biHeight; / 位图的高度,以像素为单位位图的高度,以像素为单位WORD biPlanes; / 目标设备的平面数,一般为目标设备的平面数,一般为1WORD biBitCount/ 每个像素所需的位数,必须是每个像素所需的位数,必须是1(双色双色), 4(16色色),8(256色色)或或24(真彩色真彩色)之一之一DWORD biCompression;
10、 / 位图压缩类型,必须是位图压缩类型,必须是 0(不压不压缩缩),1(BI_RLE8压缩类型压缩类型)或或2(BI_RLE4压缩类型压缩类型)之一之一DWORD biSizeImage; / 位图的大小,以字节为单位位图的大小,以字节为单位LONG biXPelsPerMeter; / 位图水平分辨率,每米像素数位图水平分辨率,每米像素数LONG biYPelsPerMeter; / 位图垂直分辨率,每米像素数位图垂直分辨率,每米像素数DWORD biClrUsed;/ 位图实际使用的颜色表中的颜色数位图实际使用的颜色表中的颜色数DWORD biClrImportant;/ 位图显示过程中重
11、要的颜色数位图显示过程中重要的颜色数 BITMAPINFOHEADER;该结构占据;该结构占据40个字节。个字节。20:37:53冯筠:VC+图像编程图像格式:颜色表图像格式:颜色表 颜色表用于说明位图中的颜色,它有若干个表项,颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个每一个表项是一个RGBQUAD类型的结构,定义类型的结构,定义一种颜色。一种颜色。RGBQUAD结构的定义如下结构的定义如下: typedef struct tagRGBQUAD BYTE rgbBlue;/ 蓝色的亮度蓝色的亮度(值范围为值范围为0-255)BYTE rgbGreen; / 绿色的亮度绿色的亮
12、度(值范围为值范围为0-255)BYTE rgbRed; / 红色的亮度红色的亮度(值范围为值范围为0-255)BYTE rgbReserved;/ 保留,必须为保留,必须为0 RGBQUAD;20:37:53冯筠:VC+图像编程图像格式:位图信息图像格式:位图信息颜色表中颜色表中RGBQUAD结构数据的个数由结构数据的个数由BITMAPINFOHEADER 中的中的biBitCount项来确定,当项来确定,当biBitCount=1,4,8时,分别有时,分别有2,16,256个颜色表项,当个颜色表项,当biBitCount=24时,图像为真彩色,图像中每个像素的颜色用时,图像为真彩色,图像中
13、每个像素的颜色用三个字节表示,分别对应三个字节表示,分别对应R、G、B值,图像文件没有颜色表项。值,图像文件没有颜色表项。位图信息头和颜色表组成位图信息,位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如结构定义如下下:typedef struct tagBITMAPINFO BITMAPINFOHEADER bmiHeader; / 位图信息头位图信息头RGBQUAD bmiColors1; / 颜色表头指针颜色表头指针 BITMAPINFO;RGBQUAD结构中定义的颜色值中,红色、绿色和蓝色的排列顺结构中定义的颜色值中,红色、绿色和蓝色的排列顺序与一般真彩色图像文件的颜色数据
14、排列顺序恰好相反序与一般真彩色图像文件的颜色数据排列顺序恰好相反 20:37:53冯筠:VC+图像编程图像格式:位图数据图像格式:位图数据位图数据记录了位图的每一个像素值或该对应像素的位图数据记录了位图的每一个像素值或该对应像素的颜色表的索引值,图像记录顺序是在扫描行内是从左颜色表的索引值,图像记录顺序是在扫描行内是从左到右到右,扫描行之间是从下到上。扫描行之间是从下到上。位图的一个像素值所占的字节数:当位图的一个像素值所占的字节数:当biBitCount=1时,时,8个像素占个像素占1个字节;当个字节;当biBitCount=4时,时,2个个像素占像素占1个字节;当个字节;当biBitCou
15、nt=8时,时,1个像素占个像素占1个字节;当个字节;当biBitCount=24时时,1个像素占个像素占3个字节,个字节,此时图像为真彩色图像。此时图像为真彩色图像。当图像不是为真彩色时,图像文件中包含颜色表,位当图像不是为真彩色时,图像文件中包含颜色表,位图的数据表示对应像素点在颜色表中相应的索引值,图的数据表示对应像素点在颜色表中相应的索引值,当为真彩色时,每一个像素用三个字节表示图像相应当为真彩色时,每一个像素用三个字节表示图像相应像素点彩色值,每个字节分别对应像素点彩色值,每个字节分别对应R、G、B分量的值,分量的值,这时候图像文件中没有颜色表。这时候图像文件中没有颜色表。 20:3
16、7:53冯筠:VC+图像编程图像格式:位图数据的计算图像格式:位图数据的计算Windows规定图像文件中一个扫描行所占的字规定图像文件中一个扫描行所占的字节数必须是节数必须是4的倍数的倍数(即以字为单位即以字为单位),不足的以不足的以0填填充,图像文件中一个扫描行所占的字节数计算方充,图像文件中一个扫描行所占的字节数计算方法:法:DataSizePerLine= (biWidth* biBitCount+31)/8;/ 一个扫描行所占的字节数一个扫描行所占的字节数位图数据的大小按下式计算位图数据的大小按下式计算(不压缩情况下不压缩情况下):DataSize= DataSizePerLine*
17、biHeight。20:37:53冯筠:VC+图像编程打开图像做的主要工作打开图像做的主要工作将流数据读入相应的数据结构将流数据读入相应的数据结构 BITMAPFILEHEADER, BITMAPINFOHEADER BITMAPINFO RGBQUAD创建位图数据块创建位图数据块(m_pDIB指向的数据块指向的数据块)创建调色板创建调色板 (m_pPalette指向的数据块指向的数据块)创建创建CDC需要的位图(需要的位图(m_Bitmap)20:37:53冯筠:VC+图像编程存储图像的数据结构存储图像的数据结构在文档类中:在文档类中:CDib * m_pDib;/原始图像对象指针(右)原始
18、图像对象指针(右)CDib * m_pResultDib;/显示或处理效果图像对象指针显示或处理效果图像对象指针在在CDib类中类中CBitmap* m_pBitmap;/位图指针位图指针CPalette* m_pPalette;/调色板指针调色板指针HBITMAP m_hBitmap;/位图块句柄位图块句柄HDIB m_hDib; /设备无关位图句柄设备无关位图句柄20:37:53冯筠:VC+图像编程读取时用到的函数读取时用到的函数hDIB=GlobalAlloc(GHND,dwSize)分配内存,返回句柄分配内存,返回句柄lpBI=(LPBYTE)GlobalLock(hDIB)将该内存块
19、全局锁定,返回指针将该内存块全局锁定,返回指针GlobalUnlock(hDib);解锁解锁强制类型转换强制类型转换lpbi=(LPBITMAPINFOHEADER)lpBICopyMemory(lpbi,lpDIB,dwSize)内存复制内存复制20:37:53冯筠:VC+图像编程读取中遇到的读取中遇到的CFile函数函数pFile-Read (&pointer, ,size)从该文件当前位置读取固定大小的数据,放入地址中(最多从该文件当前位置读取固定大小的数据,放入地址中(最多64k)DWORD dwCount=pFile-ReadHuge (lpBI,dwSize)同上,但大小可超过同上
20、,但大小可超过64k DWORD dwLength=pFile-GetLength ()该文件的长度(大小)该文件的长度(大小)pFile-SeekToBegin ();将文件指针恢复到文件头将文件指针恢复到文件头20:37:53冯筠:VC+图像编程跟踪打开(读入)图像文件的过程跟踪打开(读入)图像文件的过程ON_COMMAND(ID_FILE_OPEN, CWinApp:OnFileOpen)CViewDIBDoc:OnOpenDocument- CViewDIBDoc:Serialize- CDib:Serialize- CDib:Read(CFile *pFile)(*重点看,已注释)重
21、点看,已注释) CDib:Create(LPBYTE lpDIB)-(*重点看重点看,已注释)已注释) CDib:UpdateInternal-(*创建调色板,创建位图)创建调色板,创建位图) CDib:BuildPalette()-(*已标注下节课详讲)已标注下节课详讲) DIBAPI-CreateDIBPalette- CDib:BuildBitmap() (*已标注下节课详讲)已标注下节课详讲) DIBAPI-DIBToDIBSection20:37:53冯筠:VC+图像编程显示图像做的主要工作显示图像做的主要工作将创建好的位图联系到设备上下文中将创建好的位图联系到设备上下文中 (pDC
22、-SelectObject)在在OnDraw函数中绘制图像函数中绘制图像20:37:53冯筠:VC+图像编程图形设备接口(图形设备接口(GDI) GDI是是Windows提供的一套函数和结构,以便于我们提供的一套函数和结构,以便于我们调用它们来绘图。调用它们来绘图。因为我们有不同的输出设备,各种显示器,各种打印因为我们有不同的输出设备,各种显示器,各种打印机,他们有不同的打印驱动程序,机,他们有不同的打印驱动程序,GDI提供这样一个提供这样一个平台,屏蔽了他们的差异。平台,屏蔽了他们的差异。使用的使用的GDI全部使用设备上下文(全部使用设备上下文(DC)作为显示设备)作为显示设备的信息来源。因
23、此,我们无需关心设备的特性。的信息来源。因此,我们无需关心设备的特性。在图形绘制当中,提供了一个叫做设备上下文在图形绘制当中,提供了一个叫做设备上下文(DC)的的结构,是一个结构,是一个GDI提供的接口供我们来访问设备,所提供的接口供我们来访问设备,所有的绘图都是通过设备上下文来进行。有的绘图都是通过设备上下文来进行。因此,同一应用程序可以在配有不同的类型显示器的因此,同一应用程序可以在配有不同的类型显示器的计算机上使用。应用程序不需要针对所有显示器进行计算机上使用。应用程序不需要针对所有显示器进行更改更改 20:37:53冯筠:VC+图像编程设备描述表类(设备描述表类(CDC)当当 Wind
24、ows 程序在屏幕、打印机或其他输出设备上画程序在屏幕、打印机或其他输出设备上画图时,它并不是将像素直接输出到设备上,而是将图绘图时,它并不是将像素直接输出到设备上,而是将图绘制到由设备描述表(制到由设备描述表(DC)表示的逻辑意义上的)表示的逻辑意义上的“显示显示平面平面”上去上去 .设备描述表是一种数据结构,它包含设备描述表是一种数据结构,它包含 GDI 需要的所有需要的所有关于显示平面情况的描述字段,包括相连的物理设备和关于显示平面情况的描述字段,包括相连的物理设备和各种各样的状态信息。各种各样的状态信息。 MFC 的的 CDC 类将类将 Windows 设备描述表和获取设备设备描述表和
25、获取设备描述表句柄的描述表句柄的 GDI 函数就近封装在一起,而函数就近封装在一起,而 CDC 派派生类如生类如 CPaintDC 和和 CClientDC 则代表则代表 Windows 应用程序使用的不同类型的设备描述表。应用程序使用的不同类型的设备描述表。 20:37:53冯筠:VC+图像编程CDC的用法的用法在在 MFC 应用程序中获取设备描述表的一种方法是调应用程序中获取设备描述表的一种方法是调用用CWnd:GetDC,它返回指向表示,它返回指向表示 Windows 设备设备描述表的描述表的 CDC 对象的指针。在画图完毕时,要用对象的指针。在画图完毕时,要用 CWnd:Release
26、DC 释放由释放由 CWnd:GetDC 获取的获取的设备描述表指针设备描述表指针 CPaintDC用于在窗口客户区画图(仅限于用于在窗口客户区画图(仅限于 OnPaint 处理程序)处理程序)CClientDC用于在窗口客户区画图(除用于在窗口客户区画图(除 OnPaint 外的任何处理程序)外的任何处理程序)CWindowDC用于在窗口内任意地方画图,用于在窗口内任意地方画图,包括非客户区包括非客户区CMetaFileDC用于向用于向 GDI 元文件画图元文件画图20:37:53冯筠:VC+图像编程在在CDC上绘画上绘画CDC进行绘画的时候,可以使用多种资源,进行绘画的时候,可以使用多种资
27、源,例如:例如:pDC- SelectObject( CPen* pPen );pDC- SelectObject( CBrush* pBrush );pDC- SelectObject( CFont* pFont );pDC- SelectObject( CBitmap* pBitmap );pDC- SelectObject( CRgn* pRgn );pDC-SelectPalette (m_pPalette,TRUE)20:37:53冯筠:VC+图像编程图像的显示图像的显示显示显示DIB位图数据可以通过设备上下文位图数据可以通过设备上下文CDC对象的成对象的成员函数员函数CDC:Bit
28、blt()或或CDC:StretchBlt()来来实现,也可以通过实现,也可以通过API函数函数SetDIBBitsToDevice()或或StretchDIBBits()来实现来实现StretchDIBBits()和和CDC:StretchBlt()可以将可以将图像进行放大和缩小显示。图像进行放大和缩小显示。当从文档中装入位图文件时,当从文档中装入位图文件时,CDIBView类的类的OnInitialUpdate函数将被调用,因此可以在该函数函数将被调用,因此可以在该函数中实现对视图尺寸的设置,用于正确的显示位图,然中实现对视图尺寸的设置,用于正确的显示位图,然后就可以在视图类的后就可以在视
29、图类的OnDraw()函数中正确的显示()函数中正确的显示位图了。位图了。20:37:53冯筠:VC+图像编程CDC中画图像的方法中画图像的方法 CViewDIBView:OnDraw()()pDoc-m_pDib -Display (pDC,0,0) 一般采用双缓冲技术,防止闪屏一般采用双缓冲技术,防止闪屏 CDC MemDC;MemDC.CreateCompatibleDC (pDC);/创建一个内存的中上下创建一个内存的中上下文草稿文草稿 /选择位图资源选择位图资源CBitmap*pOldBmp=MemDC.SelectObject (m_pBitmap); /进行位拷贝进行位拷贝 BOOL bSuccess=pDC-BitBlt (x,y,GetWidth(),GetHeight(), &MemDC, 0,0, dwRop);/恢复过去的上下文环境恢复过去的上下文环境20:37:53冯筠:VC+图像编程参考书参考书“精通VC+图像编程”:周长发网上视频35 结束语结束语