介绍CxImage类库

简介: CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说,有那么多优秀的图形库,如OpenIL,FreeImage,PaintLib等等,它们可谓是功能强大,齐全,没必要用其它的类库。

在向大家介绍CxImage类库之前,先向大家推荐一个优秀的站点: http://www.codeproject.com。这个站点有很多值得收藏的文章和源码。本文就是根据此站点相关信息写成。

CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说,有那么多优秀的图形库,如OpenIL,FreeImage,PaintLib等等,它们可谓是功能强大,齐全,没必要用其它的类库。但我要说,这些类库基本上没有免费的,使用这些类库,你要被这样那样的许可协议所束缚。在这点上,CxImage类库是完全免费的。另外,在使用上述类库时,你会遇到重重麻烦。因为它们大部分是平台无关的,且用C语言写成,有的还夹杂着基本的C++ wrapper和成堆德编译选项的声明需要你去处理。而CxImage类库在这方面做得很好。还有让我最看好的,就是作者完全公开了源代码。相对于那些封装好的图形库和GDI+来说,这一点使我们可以进一步学习各种编解码技术,而不再浮于各种技术的表面。 CxImage类库的结构:

一个CxImage对象是一个扩展了的位图。作者只是在位图结构上添加了一些起存储信息作用的成员变量。一个CxImage对象(同时)也是一组层。每个层只有在需要时才会分配相应的缓冲区。CxImage::pDib代表着背景图像,CxImage::pAlpha代表着透明层,CxImage::pSelection代表着被选中的层,被用来创建图像处理时让用户感兴趣的区域。在这三个特殊层面的基础上,你可以增加一些额外的层,这些层可以存储在CxImage::pLayers中。一般说来,层是一个完整的CxImage对象。因此,你可以构造很复杂的嵌套层。下面是CxImage的一些成员变量:

 

None.gif  class  CxImage
ExpandedBlockStart.gif    {
InBlock.gif  dot.gif
InBlock.gif   protected :
InBlock.gif   void *  pDib;             // 包含文件头,调色板等等 
InBlock.gif 
  BITMAPINFOHEADER head;  // 标准的文件头(位图) 
InBlock.gif 
  CXIMAGEINFO info;       // 扩展了的信息 
InBlock.gif 
  BYTE *  pSelection;       // 用户选中的区域 
InBlock.gif 
  BYTE *  pAlpha;           // alpha通道 
InBlock.gif 
  CxImage **  pLayers;      // 通用层 
ExpandedBlockEnd.gif 
  } 

ExpandedBlockStart.gif typedef   struct  tagCxImageInfo   {
InBlock.gif    DWORD   dwEffWidth;        // DWORD 扫描线宽 
InBlock.gif 
    BYTE *    pImage;            // 图像位数 
InBlock.gif 
     void *    pGhost;            // if this is a ghost, pGhost point to the body 
InBlock.gif 
    DWORD   dwType;            // 原图像的格式 
InBlock.gif 
     char     szLastError[ 256 ];  // 出错信息 
InBlock.gif 
     long     nProgress;         // 监视循环的次数 
InBlock.gif 
     long     nEscape;           // 跳出标志 
InBlock.gif 
     long     nBkgndIndex;       // GIF, PNG, MNG格式使用 
InBlock.gif 
    RGBQUAD nBkgndColor;       // RGB三原色透明度 
InBlock.gif 
    BYTE    nQuality;          // JPEG格式使用 
InBlock.gif 
     long     nFrame;            // TIF, GIF, MNG使用 :实际的帧数 
InBlock.gif 
     long     nNumFrames;        // TIF, GIF, MNG使用 :帧总数 
InBlock.gif 
    DWORD   dwFrameDelay;      // GIF, MNG使用 
InBlock.gif 
     long     xDPI;              // 水平分辨率 
InBlock.gif 
     long     yDPI;              // 垂直分辨率 
InBlock.gif 
    RECT    rSelectionBox;     // 选中的矩形区 
InBlock.gif 
    BYTE    nAlphaMax;         // 阴影的最大不透明度 
InBlock.gif 
     bool     bAlphaPaletteEnabled;   // 如果调色板中有Alpha通道则为真 
InBlock.gif 
     bool     bEnabled;          // 打开绘图函数 
InBlock.gif 
     long     xOffset;
InBlock.gif     long     yOffset;
InBlock.gifDWORD   dwEncodeOption;    // 一些编码选项 
InBlock.gif 
RGBQUAD last_c;            // 一些优化选项 
InBlock.gif 
    BYTE    last_c_index;
InBlock.gif     bool     last_c_isvalid;
InBlock.gif     long     nNumLayers;
InBlock.gif    DWORD   dwFlags;
ExpandedBlockEnd.gif
 CXIMAGEINFO;

 

要在picture box中显示一个png格式的文件,只需:
CxImage image("myfile.png", CXIMAGE_FORMAT_PNG);
HBITMAP m_bitmap = image.MakeBitmap(m_picture.GetDC()->m_hDC);
m_picture.SetBitmap(m_bitmap);
其它格式则类推。

Examples: how to ...
... convert from a format to another

None.gif CxImage  image;
None.gif  //   bmp -> jpg 
None.gif 
image.Load( " image.bmp " , CXIMAGE_FORMAT_BMP);
ExpandedBlockStart.gif  if  (image.IsValid())  {
InBlock.gif     if ( ! image.IsGrayScale()) image.IncreaseBpp( 24 );
InBlock.gif    image.SetJpegQuality( 99 );
InBlock.gif    image.Save( " image.jpg " ,CXIMAGE_FORMAT_JPG);
ExpandedBlockEnd.gif

None.gif  //   png -> tif 
None.gif 
image.Load( " image.png " , CXIMAGE_FORMAT_PNG);
ExpandedBlockStart.gif  if  (image.IsValid())  {
InBlock.gif    image.Save( " image.tif " ,CXIMAGE_FORMAT_TIF);
ExpandedBlockEnd.gif

None.gif 
None.gif  dot.gif load an image resource
None.gif  //  Load the resource IDR_PNG1 from the PNG resource type 
None.gif 
CxImage *  newImage  =    new  CxImage();
None.gifnewImage -> LoadResource(FindResource(NULL,MAKEINTRESOURCE(IDR_PNG1),
None.gif                        " PNG " ),CXIMAGE_FORMAT_PNG);
None.gifor  //  Load the resource IDR_JPG1 from DLL 
None.gif 
CxImage *  newImage  =    new  CxImage();
None.gifHINSTANCE hdll = LoadLibrary( " imagelib.dll " );
ExpandedBlockStart.gif  if  (hdll)  {
InBlock.gif    HRSRC hres = FindResource(hdll,MAKEINTRESOURCE(IDR_JPG1), " JPG " );
InBlock.gif    newImage -> LoadResource(hres,CXIMAGE_FORMAT_JPG,hdll);
InBlock.gif    FreeLibrary(hdll);
ExpandedBlockEnd.gif

None.gifor  //  Load a bitmap resource; 
None.gif 
HBITMAP bitmap  =  ::LoadBitmap(AfxGetInstanceHandle(),
None.gif                              MAKEINTRESOURCE(IDB_BITMAP1)));
None.gifCxImage  * newImage  =    new  CxImage();
None.gifnewImage -> CreateFromHBITMAP(bitmap);
None.gif dot.gif decode an image from memory
None.gifCxImage image((BYTE * )buffer,size,image_type);
None.giforCxMemFile memfile((BYTE * )buffer,size);
None.gifCxImage image( & memfile,image_type);
None.giforCxMemFile memfile((BYTE * )buffer,size);
None.gifCxImage *  image  =    new  CxImage();
None.gifimage -> Decode( & memfile,type);
None.gif dot.gif encode an image   in  memory
None.gif  long  size = 0 ;
None.gifBYTE *  buffer = 0 ;
None.gifimage.Encode(buffer,size,image_type);
None.gif dot.gif
None.giffree(buffer);
None.giforCxMemFile memfile;
None.gifmemfile.Open();
None.gifimage.Encode( & memfile,image_type);
None.gifBYTE *  buffer  =  memfile.GetBuffer();
None.gif  long  size  =  memfile.Size();
None.gif dot.gif
None.giffree(buffer);
None.gif dot.gif create a multipage TIFF
None.gifCxImage  * pimage[ 3 ];
None.gifpimage[ 0 ] =& image1;
None.gifpimage[ 1 ] =& image2;
None.gifpimage[ 2 ] =& image3;
None.gif
None.gifFILE *  hFile;
None.gifhFile  =  fopen( " multipage.tif " , " w+b " );
None.gif
None.gifCxImageTIF multiimage;
None.gifmultiimage.Encode(hFile,pimage, 3 );
None.gif
None.giffclose(hFile);
None.giforFILE *  hFile;
None.gifhFile  =  fopen( " c:\\multi.tif " , " w+b " );
None.gif
None.gifCxImageTIF image;
None.gifimage.Load( " c:\\1.tif " ,CXIMAGE_FORMAT_TIF);
None.gifimage.Encode(hFile,  true );
None.gifimage.Load( " c:\\2.bmp " ,CXIMAGE_FORMAT_BMP);
None.gifimage.Encode(hFile,  true );
None.gifimage.Load( " c:\\3.png " ,CXIMAGE_FORMAT_PNG);
None.gifimage.Encode(hFile);
None.gif
None.giffclose(hFile);
None.gif
None.gif dot.gif copy / paste an image
None.gif  //  copy 
None.gif 
HANDLE hDIB  =  image -> CopyToHandle();
ExpandedBlockStart.gif  if  (::OpenClipboard(AfxGetApp() -> m_pMainWnd -> GetSafeHwnd()))   {
ExpandedSubBlockStart.gif     if (::EmptyClipboard())  {
ExpandedSubBlockStart.gif         if  (::SetClipboardData(CF_DIB,hDIB)  ==  NULL )  {
InBlock.gif            AfxMessageBox(  " Unable to set Clipboard data "  );
ExpandedBlockEnd.gif
    } 
    } 

None.gifCloseClipboard();
None.gif
None.gif  //  paste 
None.gif 
HANDLE hBitmap = NULL;
None.gifCxImage  * newima  =    new  CxImage();
None.gif  if  (OpenClipboard()) hBitmap = GetClipboardData(CF_DIB);
None.gif  if  (hBitmap) newima -> CreateFromHANDLE(hBitmap);
None.gifCloseClipboard();
None.gif

 

需要大家注意的是:整个CxImage类库非常大。如果你只需要能处理其中的几种格式,你可以在主要的头文件ximage.h中找到一些开关选项来关闭一些图像库。JPG、PNG、TIFF中的每一个库,都会向最终程序增加约100KB的内容。而CxImage类库压缩后只有约60KB。所以,你需要谨慎挑选一些你真正需要的类库。作者提供的示例工程在编译后,你会发现如下一些文件: ·CxImage : cximage.lib - static library ·CxImageCrtDll : cximagecrt.dll - DLL not using mfc ·CxImageMfcDll : cximage.dll - DLL using mfc ·Demo : demo.exe - program linked with cximage.lib and the C libraries ·DemoDll : demodll.exe - program linked with cximagecrt.dll ·j2k,jasper,jbig,jpeg,png,tiff,zlib : static C libraries 构建这些工程需要耗费几分钟的时间(中间文件可达60MB)。下面则是使用CxImage类库前必须设置的一些参数:

Project Settings
 |- C/C++
 |   |- Code Generation
 |   |   |- Use run-time library : Multithreaded DLL (must be the same for 
 |   |   |  all the linked libraries)
 |   |   |- Struct member alignment : must be the same for all the linked 
 |   |   |  libraries
 |   |- Precompiled headers : not using precompiled headers
 |   |- Preprocessor
 |       |- Additional Include Directories:  ..\cximage
 |- Link
    |- General
        |- Object/library modules: ../png/Debug/png.lib 
                                   ../jpeg/Debug/jpeg.lib 
                                   ../zlib/Debug/zlib.lib 
                                   ../tiff/Debug/tiff.lib 
                                    ../cximage/Debug/cximage.lib  ...

兼容性: - Microsoft Visual C++ 6.0 (static library, DLL and OCX builds) - Microsoft Visual C++ .NET 2003 - Borland C++ Builder version 3 and version 6 - Kdevelop 2.1 with gcc 2.96 (Linux) 关于CxImage类库作者: Davide Pizzolato,一位电子工程师。1984年开始编程,已不在乎使用何种编程语言来开发软件。现就职于Askoll的电子研发部。

目录
相关文章
|
10月前
Qt对动态库(*.dll)的封装以及使用
Qt对动态库(*.dll)的封装以及使用
199 0
|
数据采集 XML 前端开发
parsel类库使用
parsel类库使用
215 0
|
C++
FFMPEG音频视频开发: VS2010+QT4.8.5引用FFMPEG库
FFMPEG音频视频开发: VS2010+QT4.8.5引用FFMPEG库
142 0
FFMPEG音频视频开发: VS2010+QT4.8.5引用FFMPEG库
|
存储 索引 程序员
VC:CxImage 試用
下載回來後,裡面雖然有完整的說明文件,但似乎找不到安裝說明,有點頭痛。試著把裡面各個目錄中的專案都 running 過一次後,結果產生了以下的 *.lib 檔案
1040 0
|
存储 编解码 C++
CxImage 简单配置与使用
CxImage 简单配置与使用 如果本篇文章还不能解决你在生成解决方案以及便宜过程中的问题 请参阅: http://blog.csdn.net/afterwards_/article/details/7997385 我个人配置过来成功运行的经验.
1657 0
|
C++
CxImage学习
官方下载地址是:http://www.xdp.it/cximage/   打开工程后可以看到下例这些工程: - CxImage - CxImageCrtDll - CxImageMfcDll - dome - domeDll - jasper - jbig - jpeg - libdcr - mng - png - tiff - zlib   1。
1270 0