技术开发 频道

十全大补:CxImage图像处理类库

  CxImage库的结构

  在整个库的继承树中,CxImage位于所有其他模块的顶部。这不是一个完全的符合OOP的方式,但是至少从最初的版本一直到现在,它都工作得很好。现在想要改变整个结构,已经太晚了。但是,你总是可以使用这些继承类来操作相应格式的图像,例如你可以使用CxImageTIF来保存多页的TIFF文件。这样显得非常直观。

  连接所有模块和C库的是CxFile。这是一个虚类,它提供了标准的方法,用于访问硬盘或者内存的文件数据。 
 
  CxImage的继承树
  一个CxImage对象基本上对应于一副位图,同时添加了一些额外的成员变量用于存储一些有用的信息。

class 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

0
相关文章