CxImage库学习体会之一

来源:互联网 发布:南京证券下载软件 编辑:程序博客网 时间:2024/05/22 00:36
 

以前见别人使用Cximage库来处理图片,当时见到很兴奋.这么强大的东西怎么我不会呢!
可惜当时由于项目原因,没有研究过这个库. 终于这段时间有空了. 翻出来研究研究.和大家一起分享.
 
   库使用之前的准备工作:
 
  库使用之前要编译下几个lib文件.根据你的需要编译lib库. 我只是拿来测试的,就只需要支持BMP,JPG,PNG,GIF. 首先在库代码中找到ximacfg.h .这个文件就是开关设置.就是只编译你需要的图片格式的库,其他的就不用了.否则lib库会很大的.以下是我的设置

// CxImage supported formats
#define CXIMAGE_SUPPORT_BMP 1
#define CXIMAGE_SUPPORT_GIF 1
#define CXIMAGE_SUPPORT_JPG 1
#define CXIMAGE_SUPPORT_PNG 1
#define CXIMAGE_SUPPORT_ICO 0
#define CXIMAGE_SUPPORT_TIF 0
#define CXIMAGE_SUPPORT_TGA 0
#define CXIMAGE_SUPPORT_PCX 0
#define CXIMAGE_SUPPORT_WBMP 0
#define CXIMAGE_SUPPORT_WMF 0

#define CXIMAGE_SUPPORT_JP2 0
#define CXIMAGE_SUPPORT_JPC 0
#define CXIMAGE_SUPPORT_PGX 0
#define CXIMAGE_SUPPORT_PNM 0
#define CXIMAGE_SUPPORT_RAS 0

#define CXIMAGE_SUPPORT_JBG 0
#define CXIMAGE_SUPPORT_MNG 0
#define CXIMAGE_SUPPORT_SKA 0
#define CXIMAGE_SUPPORT_RAW 0

呵呵,只留了4个.
 然后在编译器上,选择当前活动工程.project->set active project ->
  依次选择 Cximage,jpeg,png,zlib.(这里说下zlib,这个不是所谓的图片格式的库,网上查了下 "
 zlib 程序库作为压缩引擎,zlib 也是著名的 gzip (GNU zip) 所采用的压缩引擎。".在这里应该是起图片压缩的作用吧. 还得说下 Cximage(和它相关的 dll,mfc形式)和zlib是一定要的,其他的像png,jpeg等是根据需要而定).

然后慢慢的等待编译吧 ........

最后生成了 cximage.lib Jpeg.lib png.lib zlib.lib 4个

......前期工作准备好了.

2.库的使用.

  新建一个工程.SDI,基于对话框的dialog都可以的.
  我是建了基于对话框的.(xImageTest)

  先做相关的设置
1.
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   ...

2.tools ->options ->Directory
    include files  添加 工程中的include文件夹.其中包括
                 xfile.h ximacfg.h ximadef.h ximage.cpp ximage.h
                 xiofile.h xmemfile.cpp xmemfile.h
    library fiel  添加 工程中的lib文件夹.其中包括
                 cximage.lib Jpeg.lib png.lib zlib.lib .

设置工作做好了,接下来就是功能实现了.
  我要实现的功能有:
   1.加载PNG,BMP,JPG图片.
   2.转换bmp To JPG图片

void CXImageTestDlg::Test()
{
 CClientDC dc(this);
 CDC dcMem,hdcTmp[1];
 int i =0;
 int nWidth = 170;
 int nHeight = 53;

 dcMem.CreateCompatibleDC(&dc);
        //加载PNG格式
/* hdcTmp[i].CreateCompatibleDC(&dc);

 CBitmap bitmap;
 bitmap.CreateCompatibleBitmap(&dc,nWidth*4,nHeight);
 hdcTmp[i].SelectObject(bitmap);

 CxImage* newImage = new CxImage();
    newImage->LoadResource(FindResource(NULL,MAKEINTRESOURCE(1118),"PNG"),CXIMAGE_FORMAT_PNG);
    newImage ->Draw(hdcTmp[0]);

    dc.BitBlt(0,0,nWidth,nHeight,&hdcTmp[i],0,0,SRCCOPY);
 DeleteRes(newImage);
 DeleteObject(hdcTmp[i]);
*/
 //加载BMP格式
 HBITMAP bitmap = ::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(1117));
        image = new CxImage();
        image->CreateFromHBITMAP(bitmap);
 dcMem.SelectObject(bitmap);
 dc.BitBlt(0,0,nWidth,nHeight,&dcMem,0,0,SRCCOPY);
}

void CXImageTestDlg::LoadBgSource()
{
    CClientDC dc(this);
    CDC dcMem;
    HBITMAP hbit;
    CBitmap bitmap ;
    bitmap.LoadBitmap(1117);
    dcMem.CreateCompatibleDC(&dc);
    hbit = (HBITMAP)dcMem.SelectObject(bitmap);
    dc.BitBlt(0,0,300,400,&dcMem,0,0,SRCCOPY);
}

void CXImageTestDlg::OnBtnbmptojpg()
{
 // TODO: Add your control notification handler code here
 CxImage   image;
 // bmp -> jpg
 image.Load("1117.bmp", CXIMAGE_FORMAT_BMP);
 if (image.IsValid())
 {
  if(!image.IsGrayScale()) image.IncreaseBpp(24);
  image.SetJpegQuality(99);
  image.Save("1117.jpg",CXIMAGE_FORMAT_JPG);
 }
}

void CXImageTestDlg::OnBtnpng2tif()
{
 // TODO: Add your control notification handler code here
/*      需要支持TIF格式的lib库
   CxImage   image;
 image.Load("//res//1118.png ", CXIMAGE_FORMAT_PNG);
 if (image.IsValid())
 {
  image.Save("//res//image.tif",CXIMAGE_FORMAT_TIF );
 }*/
}

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////

补充说明:

   1.下载最新的源码(6.0.0),如果在windows下使用库.

    以下配置不要修改

 #define CXIMAGE_SUPPORT_ALPHA          1
#define CXIMAGE_SUPPORT_SELECTION      1
#define CXIMAGE_SUPPORT_TRANSFORMATION 1
#define CXIMAGE_SUPPORT_DSP            1
#define CXIMAGE_SUPPORT_LAYERS           1

#define CXIMAGE_SUPPORT_DECODE    1
#define CXIMAGE_SUPPORT_ENCODE    1        //<vho><T.Peck>
#define    CXIMAGE_SUPPORT_WINDOWS 1

 

  但在wince(pocket 2003下)下使用:

#define CXIMAGE_SUPPORT_ALPHA          1
#define CXIMAGE_SUPPORT_SELECTION      0
#define CXIMAGE_SUPPORT_TRANSFORMATION 0
#define CXIMAGE_SUPPORT_DSP            0
#define CXIMAGE_SUPPORT_LAYERS           0

#define CXIMAGE_SUPPORT_DECODE    1
#define CXIMAGE_SUPPORT_ENCODE    0        //<vho><T.Peck>
#define    CXIMAGE_SUPPORT_WINDOWS 0
#define    CXIMAGE_SUPPORT_WINCE   1        //<T.Peck>
#define CXIMAGE_SUPPORT_MEMORY_FILE        0    //内存文件的支持

 

注意区别.我就没有注意这点.搞了我半天.郁闷.

 

源码编译后,主要会生成 cximage.dll.cximage.lib 等其他的lib库(如png.lib).

cximage.dll ---->由 CxImageMfcDll 工程生成.

cximage.lib ---->由CxImage 工程生成

  最后记得加.h文件哟.