CxImage库的结构
在整个库的继承树中,CxImage位于所有其他模块的顶部。这不是一个完全的符合OOP的方式,但是至少从最初的版本一直到现在,它都工作得很好。现在想要改变整个结构,已经太晚了。但是,你总是可以使用这些继承类来操作相应格式的图像,例如你可以使用CxImageTIF来保存多页的TIFF文件。这样显得非常直观。
连接所有模块和C库的是CxFile。这是一个虚类,它提供了标准的方法,用于访问硬盘或者内存的文件数据。
CxImage的继承树
一个CxImage对象基本上对应于一副位图,同时添加了一些额外的成员变量用于存储一些有用的信息。
{
...
protected:
void* pDib; //包含文件头,调色板和像素数据
BITMAPINFOHEADER head; //标准文件头
CXIMAGEINFO info; //扩展信息
BYTE* pSelection; //选区
BYTE* pAlpha; //alpha通道
CxImage** ppLayers; //普通层
CxImage** ppFrames; //动画的帧
}
CxImage::head 是位图文件的文件头,而CxImage::pDib就是一个普通的位图(就像你在CxImageBMP::Encode中看到的一样)。
CxImage::info 是一个方便的信息容器。这些信息被不同的文件格式所共享,同时供所有成员函数访问。
typedef struct tagCxImageInfo {
DWORD dwEffWidth; //双字节对齐宽度
BYTE* pImage; //图像数据
void* pGhost; //如果这是一个备份(ghost),
//则pGhost指向它的原始对象
DWORD dwType; //原始图像格式
char szLastError[256]; //调试信息,最后的错误信息
long nProgress; //进度
long nEscape; //取消
long nBkgndIndex; //GIF, PNG, MNG使用
RGBQUAD nBkgndColor; //RGB透明使用
BYTE nQuality; //JPEG使用
long nFrame; //TIF, GIF, MNG使用,表示当前活动帧
long nNumFrames; //TIF, GIF, MNG使用,表示总帧数
DWORD dwFrameDelay; //GIF, MNG使用,表示帧的延迟
long xDPI; //水平分辨率
long yDPI; //垂直分辨率
RECT rSelectionBox; //对象的外包围框
BYTE nAlphaMax; //最大透明度
bool bAlphaPaletteEnabled; //如果调色板中的alpha值是启用的,
//则这个变量为true
bool bEnabled; //启用绘制函数
long xOffset;
long yOffset;
DWORD dwEncodeOption; //GIF, TIF使用:
// 0=def.1=unc,2=fax3,3=fax4,
// 4=pack,5=jpg
RGBQUAD last_c; //用于优化GetNearestIndex
BYTE last_c_index;
bool last_c_isvalid;
long nNumLayers;
DWORD dwFlags;
} CXIMAGEINFO;
CxImage的不同层
CxImage对象同样是图层的集合,每个图层的缓冲区只在需要的时候申请。
CxImage::pDib是背景图像。 CxImage::pAlpha是透明层。CxImage::pSelection是选区层,用于创建要对图像的感兴趣区域进行处理的选择区域。在这三个特殊层之上,你可以添加通用的其他层,这些层都保存在CxImage::ppLayers中。通用层也是完整的CxImage对象,所以你可以创建复杂的嵌套层。CxImage::ppFrames 为动态图像(GIF)所预留。
CxImage类成员和操作
CxImage使用Doxygen 产生文档,但是由于一些历史的原因,很多不太通用的功能还没有文档。类成员的参考资料,发布历史以及许可信息都可以在这里(here )找到。
支持的格式和选项
整个CxImage库非常大,在主要的头文件ximcfg.h中,你可以找到很多编译选项开关,用于启用或者禁用某些特定的图像格式或者功能。每个JPG, PNG和 TIFF库将使得应用程序增加大约100KB的大小,同时,CxImage将使得应用程序增加大约50KB的大小。所以,为了减小你的应用程序的体积,你应该支持和链接你的应用程序确实需要的格式。
格式 | 定义#define | 需要的库 | 尺寸 [KB] |
BMP GIF ICO TGA PCX WBMP WMF SKA | CXIMAGE_SUPPORT_BMP CXIMAGE_SUPPORT_GIF CXIMAGE_SUPPORT_ICO CXIMAGE_SUPPORT_TGA CXIMAGE_SUPPORT_PCX CXIMAGE_SUPPORT_WBMP CXIMAGE_SUPPORT_WMF CXIMAGE_SUPPORT_SKA | 内建 | 24 |
JPEG | CXIMAGE_SUPPORT_JPG | jpeg | 88 |
PNG | CXIMAGE_SUPPORT_PNG | png, zlib | 104 |
MNG | CXIMAGE_SUPPORT_MNG | mng, zlib, jpeg | 148 |
TIFF | CXIMAGE_SUPPORT_TIF | tiff, zlib, jpeg | 124 |
JBIG | CXIMAGE_SUPPORT_JBG | jbig | 28 |
PNM,PPM,PGM RAS | CXIMAGE_SUPPORT_PNM CXIMAGE_SUPPORT_RAS | jasper | 176 |
JPEG-2000 | CXIMAGE_SUPPORT_JP2 CXIMAGE_SUPPORT_JPC CXIMAGE_SUPPORT_PGX | jasper | 176 |
RAW | CXIMAGE_SUPPORT_RAW | libdcr | 132 |
选项 | 定义#define | 尺寸[KB] |
CxImage核心 | 所有开关关闭 | 20 |
几何变换 (geometric transformations) | CXIMAGE_SUPPORT_TRANSFORMATION | 16 |
图像处理 (image processing) | CXIMAGE_SUPPORT_DSP | 24 |
绘制和特殊的窗口函数 (drawing and windows specific functions) | CXIMAGE_SUPPORT_WINDOWS | 12 |
透明 (transparency) | CXIMAGE_SUPPORT_ALPHA | 4 |
选择 (selections) | CXIMAGE_SUPPORT_SELECTION | 4 |
多层支持 (multiple layers) | CXIMAGE_SUPPORT_LAYERS | < 4 |
图像格式转换 (graphic formats conversion) | CXIMAGE_SUPPORT_DECODE CXIMAGE_SUPPORT_ENCODE | < 4 |
插值函数 (interpolation functions) | CXIMAGE_SUPPORT_INTERPOLATION | < 4 |
异常处理 (exception handling) | CXIMAGE_SUPPORT_EXCEPTION_HANDLING | < 4 |