收藏 分享(赏)

2012第三章 VC++图像编程基础.ppt

上传人:gsy285395 文档编号:4224556 上传时间:2018-12-16 格式:PPT 页数:35 大小:389KB
下载 相关 举报
2012第三章 VC++图像编程基础.ppt_第1页
第1页 / 共35页
2012第三章 VC++图像编程基础.ppt_第2页
第2页 / 共35页
2012第三章 VC++图像编程基础.ppt_第3页
第3页 / 共35页
2012第三章 VC++图像编程基础.ppt_第4页
第4页 / 共35页
2012第三章 VC++图像编程基础.ppt_第5页
第5页 / 共35页
点击查看更多>>
资源描述

1、第三章 VC+图像编程基础,一、与设备无关位图(DIB),与设备无关位图(DIB)可以在不同的机器或系统中显示位图所固有的颜色。与DDB相比,DIB是一种外部的位图格式,经常存储以BMP为后缀的位图文件。 1.BMP文件组成 BMP文件由文件头、位图信息头、颜色信息表和图像数据四部分组成。,位图结构如下:,2.BMP文件头 P30,BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。其结构定义如下: typedef struct tagBITMAPFILEHEADER WORD bfType; /文件类型,必须为BMP,即0x4d42DWORD bfSize; / 文件大小

2、,包括这14个字节WORD bfReserved1; / 保留字,必须为0WORD bfFeserved2; / 保留字,必须为0DWORD bfOffBIts; /从文件头到实际位图数据的偏移量字节数 BITMAPFILEHEADER;,Bf:是BITMAPFILEHEADER的缩写,这个结构的长度是固定的,为14个字节(WORD为无符号16位整数,DWORD为无符号32位整数)。 说明:为什么文件类型为BMP,即0x4d42? 原因:(4d)16 = (77)10,即字母m的ASCII码,(42)16 = (66)10,即字母b的ASCII码,3.位图信息头,位图信息头数据用于说明位图的尺

3、寸等信息 typedef struct tagBITMAPINFOHEADER DWORD biSize; /本结构所占用字节数,为40LONG biWidth; /位图的宽度,以像素为单位LONG biHeight; /位图的高度,以像素为单位。WORG biPlanes; /目标设备的级别,必须为1WORD biBitCount; / 表示颜色时所需的位数,常用的有1(二值图),4(16色),8(256色)或24(真彩色)。DWORD biCompression; /位图压缩类型,必须是0(不压缩,基本采用该形式),1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一。DWORD

4、 biSizeImage; /实际位图数据占用的字节数。 BITMAPINFOHEADER;,Bi:是BITMAPINFOHEADER的缩写,4.颜色表(调色板),用于说明位图中的颜色,他有若干个表项,每个表项是一个RGBQUAD类型的结构,定义一种颜色。其定义如下: typedef struct tagRGBQUAD BYTE rgbBlue; /蓝色的亮度(范围是0255) BYTE rgbGreen; /绿色的亮度(范围是0255) BYTE rgbRed; /红色的亮度(范围是0255) BYTE rgbReserved; /保留值 RGBQUAD;,位图信息头和颜色表组成位图信息BI

5、TMAPINFO,定义如下: typedef struct tagBITMAPINFO BITMAPINFOHEADER bmiHeader; / 位图信息头RGBQUAD bmiColors1; / 颜色表 BITMAPINFO;,5.Windows位图结构数据域的含义P30,二、CDib类库的建立 P40,MFC中没有处理DIB位图的类,所以需要定义一个处理DIB位图的专用类CDib类,在其中封装必要的DIB数据成员和处理函数。 void LoadFile(const char* dibFileName); /装载BMP位图文件 BOOL SaveFile( const char *psz

6、Filename ); /存储BMP位图文件,1. CDib类的设计目标,1)功能 主要包括: DIB文件的读、写操作 提供位图的宽度、高度、颜色数目等位图相关信息 提供有关位图占据内存空间的信息,包括图像数据区首地址、颜色表首地址、位图信息结构首地址等信息。,2)父类 MFC中的Cobject类是MFC中其他大多数类的根类和基类。他提供了许多有用的特性。另外,Cobject类具有最低限度的成员数据和函数,从Cobject类派生类所花的代价是最低的。因此,采用Cobject类作为CDib类的父类。,3)数据封装他是面向对象的重要特征。但是在设计像CDib这样的类时,因为操作DIB的Win 32

7、API函数大多需要一些DIB的属性作为参数,因此在设计CDib时应该注意程序的效率,不要过分封装。,4)继承在设计CDib类时,在程序中即要打开原图,又要对原图进行各种处理,为了能够对照处理结果,即要显示原图,又要显示处理结果图,因此对原图不做任何处理;将原图定义为CDib类的对象,而将需要处理图像的类定义为CDib类的派生类,由于派生类对基类中的保护或公有成员可以直接使用因此,因此在派生类中仅仅需要定义各种处理图像数据区的函数。,2. 构造CDib类,创建CDib类,其接口文件和实现文件分别为DIB.H和DIB.CPP . 文件DIB.H包含了CDib类的类声明有关的所有信息。如下: #if

8、ndef _CDIB_H #define _CDIB_H,class CDib : public CObject public:RGBQUAD* m_pRGB; /BYTE* m_pData; /UINT m_numberOfColors; /颜色个数BOOL m_valid;BITMAPFILEHEADER bitmapFileHeader;/文件头BITMAPINFOHEADER* m_pBitmapInfoHeader; /信息头BITMAPINFO* m_pBitmapInfo; /位图信息指针BYTE* pDib;DWORD size; /文件大小,调色板指针,图像数据,public

9、:CDib(); /无参构造函数CDib(); /析构函数char m_fileName256;char* GetFileName(); /返回位图文件名BOOL IsValid();DWORD GetSize(); /位图文件的大小UINT GetWidth(); /位图的宽度UINT GetHeight(); /位图的高度UINT GetNumberOfColors(); /颜色数目RGBQUAD* GetRGB(); /颜色表首地址BYTE* GetData(); /图像数据首地址BITMAPINFO* GetInfo(); /图像信息结构首地址,WORD PaletteSize(LPB

10、YTE lpDIB);WORD DIBNumColors(LPBYTE lpDIB);void SaveFile(const CString filename); /存储BMP位图文件 public:void LoadFile(const char* dibFileName); /装载BMP位图文件; #endif,文件DIB.CPP包含了CDib类中各函数的实现,代码如下: #include “stdafx.h“ #include “cdib.h“ #include “windowsx.h“ #include “math.h“ CDib:CDib() /定义构造函数 CDib:CDib()

11、/定义析构函数 GlobalFreePtr(m_pBitmapInfo); /删除该对象中的图像 ,BOOL CDib:IsValid() return m_valid; char* CDib:GetFileName() return m_fileName; /文件名 UINT CDib:GetWidth() return (UINT) m_pBitmapInfoHeader-biWidth; / UINT CDib:GetHeight() return (UINT) m_pBitmapInfoHeader-biHeight; /,图像宽度,还记得这是什么含义?,这个呢?,图像高度,/位图文件

12、的大小 DWORD CDib:GetSize() if (m_pBitmapInfoHeader-biSizeImage != 0)return m_pBitmapInfoHeader-biSizeImage;elseDWORD height = (DWORD) GetHeight();DWORD width = (DWORD) GetWidth();return height * width; /计算图像大小 ,还记得这是什么含义?,图像大小,/计算颜色数 UINT CDib:GetNumberOfColors() int numberOfColors; /为实际用到的颜色数 if (m_p

13、BitmapInfoHeader-biClrUsed = 0) ,颜色位数,实际使用的颜色数,BYTE* CDib:GetData() return m_pData; /图像数据 RGBQUAD* CDib:GetRGB() return m_pRGB; BITMAPINFO* CDib:GetInfo() return m_pBitmapInfo; WORD CDib:PaletteSize(LPBYTE lpDIB) return (DIBNumColors(lpDIB) * sizeof(RGBTRIPLE); ,void CDib:LoadFile(const char* dibFil

14、eName) strcpy(m_fileName,dibFileName);CFile dibFile(m_fileName, CFile:modeRead); /以读的方式打开文件。 dibFile.Read(void*) /读取文件失败 ,这个函数非常重要,通过Cfile类对象的操作来读取位图,为相应的类成员变量赋指针,void CDib:SaveFile(const CString filename) strcpy(m_fileName,filename);CFile dibFile(m_fileName, CFile:modeCreate|CFile:modeWrite);dibFil

15、e.Write(void*) ,只能保存宽度、高度没有改变的图像,3.流程,位图的读取方法,其流程如下,三、调色板及图像的显示,1.调色板原理 为了保证Windows基本显示界面的一致性,Windows保留了一个有20种颜色的内部系统调色板,用来描绘窗口的图标、边界、按钮等通用界面。 而在显示图像时,要使用内部系统之外的颜色,此时要创建一个逻辑调色板。并且将其实现到系统调色板中,才能显示新的颜色。,2.调色板的创建与实现,在使用VC+进行Windows的应用程序设计时,MFC基本类库提供了CDC类和Cpalette类,封装了有关调色板的操作,该类的成员函数CreatePalette负责创建逻辑

16、调色板。具体步骤如下: 建立一个LOGPALETTE结构和PSLETTEENTRY数组; 对数组元素进行初始化并对成员变量进行设置; 建立Cpalette对象并使用CreatePalette函数初始化调色板对象; 使用SelectPalette函数来将设备描述表和调色板联系起来; 使用CDC中的RealizePalette函数使得调色板生效。,3.创建调色板程序代码,在视类定义一个指向调色板的指针。Cpalette _*hPalette;为要显示的位图创建调色板,要显示的位图可以是CDib类或其派生类的对象或指针。,CPalette * CDynSplitView2:CreateBitmapP

17、alette(CDib * pBitmap) structWORD Version; /调色板的版本号,指定为0x300 WORD NumberOfEntries; /调色板中的表项数 PALETTEENTRY aEntries256; palette = 0x300, 256 ;LPRGBQUAD pRGBTable = pBitmap-GetRGB(); /调取颜色表 UINT numberOfColors = pBitmap-GetNumberOfColors(); /调色板中的颜色数 for(UINT x=0; xnumberOfColors; +x)palette.aEntriesx

18、.peRed = pRGBTablex.rgbRed;palette.aEntriesx.peGreen = pRGBTablex.rgbGreen;palette.aEntriesx.peBlue = pRGBTablex.rgbBlue;palette.aEntriesx.peFlags = 0;/ hPalette已在视类定义hPalette.CreatePalette(LPLOGPALETTE),建立一个LOGPALETTE结构,对数组元素进行初始化,对成员变量进行设置,使用CreatePalette函数初始化调色板对象,说明: 颜色表项结构PALETTEENTRY定义了调色板中的每一

19、个颜色表项的颜色和使用方式,typedef struct tag PALETTEENTRY BYTE peRed; /R分量值BYTE peGreen; /G分量值 BYTE peBlue; /B分量值BYTE peFlags; /该颜色的使用方式,一般设为0 PALETTEENTRY ;,4.图像的显示,当取到了图像数据首地址,就可以用图像文件自带的颜色表,创建调色板,载入调色板显示图像,参考程序:,5.显示函数,BitBlt()函数 当要将位图的像素从内存显示环境复制到显示器设备环境时,使用该函数,其结构如下: BOOL BitBlt( int x, int y, int nWidth,

20、int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwrop); 参数说明: x:指定绘制目标矩形左上角的逻辑X轴位置。 y:指定绘制目标矩形左上角的逻辑Y轴位置。 nWidth:目标矩形的宽度。 nHeight:目标矩形的高度 pSrcDC:设备上下文的指针。 xSrc, ySrc:指定原位图左上角的X、Y坐标。 dwrop:指定要执行的光栅运算,其操作码定义了图形设备接口(GDI)在输出操作中如何组合颜色。如: pDC-BitBlt (0,0,bm.bmWidth ,bm.bmHeight , 第1和2个参数为(0,0),表示显示在窗口

21、的左上角 SRCCOPY,表示直接将源矩形拷贝到目标矩形。,StretchDIBits函数 该函数的结构如下: int StretchDIBits(HDC hdc, int XDest , int YDest , int nDestWidth, int nDestHeight, int XSrc, int Ysrc, int nSrcWidth, int nSrcHeight, CONST VOID *lpBits, CONST BITMAPINFO * lpBitsInfo, UINT iUsage, DWORD dwRop); 参数 hdc:指向目标设备环境的句柄。 XDest:指定目标矩

22、形左上角位置的X轴坐标,按逻辑单位来表示坐标。 YDest:指定目标矩形左上角的Y轴坐标,按逻辑单位表示坐标。 nDestWidth:指定目标矩形的宽度。 nDestHeight:指定目标矩形的高度。 XSrc:指定DIB中源矩形(左上角)的X轴坐标,坐标以像素点表示。 YSrc:指定DIB中源矩形(左上角)的Y轴坐标,坐标以像素点表示。 nSrcWidth:按像素点指定DIB中源矩形的宽度。 nSrcHeight:按像素点指定DIB中源矩形的高度。 lpBits:指向DIB位的指针,这些位的值按字节类型数组存储, lpBitsInfo:指向BITMAPINFO结构的指针,该结构包含有关DIB方面的信息。 iUsage:表示是否提供了BITMAPINFO结构中的成员bmiColors。参数iUsage必须取下列值,这些值的含义如下: DIBPALCOLOR:表示该数组包含对源设备环境的逻辑调色板进行索引的16位索引值。 DIBRGBCOLORS:表示该颜色表包含原义的RGB值, dwRop:指定要执行的光栅运算。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > C/C++资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报