2.2 认识CImg类
在Visual C++的早期版本(6.0之前)中,程序员只能通过API函数对位图进行访问和操作;高版本的Visual C++和Visual C#中,微软提供了CImage类封装了更多的绘图功能和图像操作功能,但仍然没有提供完整的图像处理能力。为此,本书在配套光盘DIPDemo工程中提供了CImg类以实现对位图的访问及其他一些基本操作,并在此基础上派生了能够胜任大多数图像处理任务的CImgProcess类。
下面介绍CImg类,借此来让读者了解一些算法的基础实现。如果尝试编写自己的图像处理类,本节内容也可以作为参考。有关CImgProcess类的相关知识,将在后面的章节中根据需要来阐述。
2.2.1 主要成员函数列表
CImg类的主要成员如表2.1所示。
表2.1 CImg类的主要成员函数
如果要在应用程序中使用CImg类,请在项目中包含Img.h头文件和Img.cpp源文件。这里将逐段给出CImg类的重要代码片断并加以说明。在此之前,先介绍CImg类的公有成员以及其所提供的常用的成员函数和重载的运算符。
在Visual C++的类视图中可以看到CImg类作为一个基类,提供了对位图图像的一些基础图像操作,如从文件打开图像、保存图像至文件、读取和设置某个位置像素的灰度值等,此外还重载了常用的图像操作运算符,如按位加(+)、按位减(-)、反色(!)、按位与(&)、按位或(|),赋值(=)和相等(==),等等。
下面对CImg类的代码的实现展开详细分析,读者可以根据需要选择性地阅读下面的内容,不一定非要将注意力都集中在这些方法的细节实现上,不妨先熟悉函数的功能和调用方法,这对于理解本书后面的图像处理算法是没有影响的。
2.2.2 公有成员
CImg类拥有如下两个公有成员。
BITMAPINFOHEADER *m_pBMIH; LPBYTE *m_lpData;
其中,m_pBMIH中保存的是图像的信息头,而m_lpData中保存实际的图像数据。在此,再次提示BITMAPINFOHEADER结构的定义如下。
typedef struct tagBITMAPINFOHEADER{ DWORD biSize; // 本结构体占用的大小,单位为字节 LONG biWidth; // 位图图像的宽度,单位为像素 LONG biHeight; // 位图图像的高度,单位为像素 WORD biPlanes; // 设备上颜色平面数目,必须为1 WORD biBitCount; // 存储每个像素所使用的二进制位数 DWORD biCompression; // 是否压缩存储图像数据 DWORD biSizeImage; // 指定图像的尺寸 LONG biXPelsPerMeter; // 图像的水平分辨率,单位是像素每米 LONG biYPelsPerMeter; // 图像的垂直分辨率,单位是像素每米 DWORD biClrUsed; // 图像中实际使用了颜色索引表中的多少种颜色 DWORD biClrImportant; // 图象中重要的颜色数,如果该值为0,则认为所有的颜色都是重要的 } BITMAPINFOHEADER, *PBITMAPINFOHEADER;
可以很容易地从m_pBMIH结构中得到位图图像的基本信息。而图像数据存储变量m_lpData按照MFC规定的标准方式存储图像信息(按照4-byte整倍数的行长度和规定的顺序,以图像的左上角为坐标原点),因而也可以直接从图像文件中按顺序读取到内存。在后面的方法中,将常常使用这两个成员。而在CImg类的私有成员中,保存了颜色索引表的相关信息,以免这些信息被除了CImg类之外的代码错误修改。