精华内容
参与话题
问答
  • CxImage的使用

    万次阅读 2011-07-04 18:50:50
    原文地址:http://www.codeproject.com/KB/graphics/cximage.aspx1.简介及许可CxImage 是一个免费的C++类,可以简单而快速的加载、保存、显示,转换BMP, JPEG, GIF, PNG, TIFF, MN
     

    原文地址:http://www.codeproject.com/KB/graphics/cximage.aspx

     

    1.简介及许可

    CxImage 是一个免费的C++类,可以简单而快速的加载、保存、显示,转换BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K 等格式图像。CxImage是开源的,和zlib的许可协议一致,你可以在任何想使用的地方使用它。

    2.移植性

    该类和项目在多个编译器下进行过测试,从vc6.0至vs2008,borland c++3至6,部分的wxDev c++ 和MinGw。

    所有库都提供了UNICODE和非UNICODE配置。

    3.CxImage结构

     

    一个CxImage对象基本是一个bitmap,另外增加一些成员变量保存有用的信息。

     

    class CxImage

      {

      ...

      protected:

      void* pDib;            //contains the header, the palette, the pixels

      BITMAPINFOHEADER head; //standard header

      CXIMAGEINFO info;       //extended information

      BYTE* pSelection;        //selected region

      BYTE* pAlpha;           //alpha channel

      CxImage** pLayers;    //generic layers

      }

    CxImage::head 是一个位图头,CxImage::pDib 是通常的位图。CxImage::info 是一个存储在不同格式之间的许多共享信息,在所有成员函数中使用。

    typedef struct tagCxImageInfo {

        DWORD   dwEffWidth;       //DWORD aligned scan line width

        BYTE*   pImage;           //THE IMAGE BITS

        void*   pGhost;           //if this is a ghost, pGhost point to the body

        DWORD   dwType;           //original image format

        char    szLastError[256]; //debugging

        long    nProgress;        //monitor

        long    nEscape;          //escape

        long    nBkgndIndex;      //used for GIF, PNG, MNG

        RGBQUAD nBkgndColor;      //used for RGB transparency

        BYTE    nQuality;         //used for JPEG

        long    nFrame;           //used for TIF, GIF, MNG : actual frame

        long    nNumFrames;       //used for TIF, GIF, MNG : total number of

                                  //frames

        DWORD   dwFrameDelay;     //used for GIF, MNG

        long    xDPI;             //horizontal resolution

        long    yDPI;             //vertical resolution

        RECT    rSelectionBox;    //bounding rectangle

        BYTE    nAlphaMax;        //max opacity (fade)

        bool    bAlphaPaletteEnabled;  //true if alpha values in the palette are

                                  // enabled.

        bool    bEnabled;         //enables the painting functions

        long    xOffset;

        long    yOffset;

        DWORD   dwEncodeOption;   //for GIF, TIF : 0=def.1=unc,2=fax3,3=fax4,

                                  // 4=pack,5=jpg

        RGBQUAD last_c;           //for GetNearestIndex optimization

        BYTE    last_c_index;

        bool    last_c_isvalid;

        long    nNumLayers;

        DWORD   dwFlags;

    } CXIMAGEINFO;

     

    CxImage对象还是多层的集合。每层的缓冲只在必要的时候才被分配。

    CxImage::pDib是背景图,CxImage::pAlpha 是透明层,CxImage::pSelection 是选择层,用于创建图像处理的感兴趣的区域。在这三层外,你还可以定义,然后存储在CxImage::pLayers中。CxImage::ppFrames为动态图像(gif)保留.

    4.支持的格式和选项:

    整个库是非常大的,在主要的头文件ximcfg.h中你将找到一些开放或禁止一些特定的图形格式或特征的开关,每个JPG、PNG、TIFF库将使最终的应用程序增加大约100K的容量,cximage会影响50K的容量大小,所以你应当只支持和链接你的应用程序真正需要的格式。

     

    5.如何使用cximage

    工作区CxImagelib.dsw展示了建立一个应用程序所需要的库,在连接最终的应用程序之前你必须编译所有的库。在这个工作区中你将发现建立不同的库和应用程序的工程。

             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 C Libraries

    DemoDll: demodll.exe                    -program linked with cximagecrt.dll

    j2k,jasper,jbig,jpeg,png,tiff,zlib:    -static C Libraries

     

    在你的项目中使用CxImage,必须作如下设置

    在你的程序中添加#include ”ximage.h”

    使用CxImage写一个图像处理的新函数也很容易,下面描述怎样添加CxImage::Jitter

    函数:首先声明该函数bool Jitter(long radius=2),在文件ximage.h的CXIMAGE_SUPPORT_DSP的部分公有函数的任何区域,然后如下代码进行定义

     

    bool CxImage::Jitter(long radius)

    {

        // check if the image is valid, this should be always the first line in

        // the function

        if (!pDib) return false;

       

        // local variables

        long nx,ny;

       

        // temporary image to store the partial results of the algorithm

        CxImage tmp(*this,pSelection!=0,true,true);

       

        // limit the effects of the functions only in the smallest rectangle that

        // holds the selected region (defined with the Selection...() functions ),

        // this will speed up the loops.

        long xmin,xmax,ymin,ymax;

        if (pSelection){

            xmin = info.rSelectionBox.left; xmax = info.rSelectionBox.right;

            ymin = info.rSelectionBox.bottom; ymax = info.rSelectionBox.top;

        } else {

            xmin = ymin = 0;

            xmax = head.biWidth; ymax=head.biHeight;

        }

       

        // main loop : scan the image in vertical direction

        for(long y=ymin; y <ymax; y++){

       

            // monitor the progress of the loops

            info.nProgress = (long)(100*y/head.biHeight);

       

            // let the application a way to exit quickly

            if (info.nEscape) break;

       

            // main loop : scan the image in horizontal direction

            for(long x=xmin; x<xmax; x++){

       

            // if the feature is enabled, process only the pixels inside the

            // selected region

    #if CXIMAGE_SUPPORT_SELECTION

                if (SelectionIsInside(x,y))

    #endif //CXIMAGE_SUPPORT_SELECTION

                {

                    // main algorithm

                    nx=x+(long)((rand()/(float)RAND_MAX - 0.5)*(radius*2));

                    ny=y+(long)((rand()/(float)RAND_MAX - 0.5)*(radius*2));

                    if (!IsInside(nx,ny)) {

                        nx=x;

                        ny=y;

                    }

     

                    // save the result in the temporary image.

                    // if you can, use PixelColor only for 24 bpp images,

                    // and PixelIndex for 8, 4 and 1 bpp images : it's faster

                    if (head.biClrUsed==0){

                        tmp.SetPixelColor(x,y,GetPixelColor(nx,ny));

                    } else {

                        tmp.SetPixelIndex(x,y,GetPixelIndex(nx,ny));

                    }

     

                    // if the feature is enabled, process also the pixels

                    // in the alpha layer

    #if CXIMAGE_SUPPORT_ALPHA

                    tmp.AlphaSet(x,y,AlphaGet(nx,ny));

    #endif //CXIMAGE_SUPPORT_ALPHA

     

                }

            }

        }

     

        // save the result and exit

        Transfer(tmp);

        return true;

    }

    应用实例

    格式转换

    Code:

    CxImage  image;

    // bmp -> jpg

    image.Load("image.bmp", CXIMAGE_FORMAT_BMP);

    if (image.IsValid()){

        if(!image.IsGrayScale()) image.IncreaseBpp(24);

        image.SetJpegQuality(99);

        image.Save("image.jpg",CXIMAGE_FORMAT_JPG);

    }

    // png -> tif

    image.Load("image.png", CXIMAGE_FORMAT_PNG);

    if (image.IsValid()){

        image.Save("image.tif",CXIMAGE_FORMAT_TIF);

    }

    加载图像资源

     

    Code:

    //Load the resource IDR_PNG1 from the PNG resource type

    CxImage* newImage = new CxImage();

    newImage->LoadResource(FindResource(NULL,MAKEINTRESOURCE(IDR_PNG1),

                           "PNG"),CXIMAGE_FORMAT_PNG);

    or

    Code:

    //Load the resource IDR_JPG1 from DLL

    CxImage* newImage = new CxImage();

    HINSTANCE hdll=LoadLibrary("imagelib.dll");

    if (hdll){

        HRSRC hres=FindResource(hdll,MAKEINTRESOURCE(IDR_JPG1),"JPG");

        newImage->LoadResource(hres,CXIMAGE_FORMAT_JPG,hdll);

        FreeLibrary(hdll);

    }

     

    or

     

    Code:

    //Load a bitmap resource;

    HBITMAP bitmap = ::LoadBitmap(AfxGetInstanceHandle(),

                                  MAKEINTRESOURCE(IDB_BITMAP1)));

    CxImage *newImage = new CxImage();

    newImage->CreateFromHBITMAP(bitmap);

     

     

    解码内存中的图像

    Code:

    CxImage image((BYTE*)buffer,size,image_type);

    or

    Code:

    CxMemFile memfile((BYTE*)buffer,size);

    CxImage image(&memfile,image_type);

     

    or

     

    Code:

    CxMemFile memfile((BYTE*)buffer,size);

    CxImage* image = new CxImage();

    image->Decode(&memfile,type);

     

    编码内存中的图像

    Code:

    long size=0;

    BYTE* buffer=0;

    image.Encode(buffer,size,image_type);

    ...

    free(buffer);

     

    or

     

    Code:

    CxMemFile memfile;

    memfile.Open();

    image.Encode(&memfile,image_type);

    BYTE* buffer = memfile.GetBuffer();

    long size = memfile.Size();

    ...

    free(buffer);

     

    创建一个多页的TIFF

     

    Code:

    CxImage *pimage[3];

    pimage[0]=&image1;

    pimage[1]=&image2;

    pimage[2]=&image3;

     

    FILE* hFile;

    hFile = fopen("multipage.tif","w+b");

     

    CxImageTIF multiimage;

    multiimage.Encode(hFile,pimage,3);

     

    fclose(hFile);

    or

     

    Code:

    FILE* hFile;

    hFile = fopen("c:\\multi.tif","w+b");

     

    CxImageTIF image;

    image.Load("c:\\1.tif",CXIMAGE_FORMAT_TIF);

    image.Encode(hFile,true);

    image.Load("c:\\2.bmp",CXIMAGE_FORMAT_BMP);

    image.Encode(hFile,true);

    image.Load("c:\\3.png",CXIMAGE_FORMAT_PNG);

    image.Encode(hFile);

     

    fclose(hFile);

     

    拷贝粘贴图像

    Code:

    //copy

    HANDLE hDIB = image->CopyToHandle();

    if (::OpenClipboard(AfxGetApp()->m_pMainWnd->GetSafeHwnd())) {

        if(::EmptyClipboard()) {

            if (::SetClipboardData(CF_DIB,hDIB) == NULL ) {

                AfxMessageBox( "Unable to set Clipboard data" );

    }    }    }

    CloseClipboard();

     

    //paste

    HANDLE hBitmap=NULL;

    CxImage *newima = new CxImage();

    if (OpenClipboard()) hBitmap=GetClipboardData(CF_DIB);

    if (hBitmap) newima->CreateFromHANDLE(hBitmap);

    CloseClipboard();

     

    在picture框中显示图像文件

     

    Code:

    HBITMAP m_bitmap = NULL;

    CxImage image("myfile.png", CXIMAGE_FORMAT_PNG);

    ...

    m_bitmap = image.MakeBitmap(m_picture.GetDC()->m_hDC);

    m_picture.SetBitmap(m_bitmap);

    ...

    if (m_bitmap) DeleteObject(m_bitmap);

     

     

    展开全文
  • CxImage使用方法经验

    千次阅读 2013-03-16 00:47:34
    CxImage使用方法经验CxImage是不错的图像处理类,下载下来后,发现太复杂,详细说明的文档也没有,个人总结经验如下:(一)安装使用前要先打开CxImgLib.dsw,进行编辑成LIB库文件。随后的使用方法如下:一、最复杂...

    CxImage使用方法经验

    CxImage是不错的图像处理类,下载下来后,发现太复杂,详细说明的文档也没有,个人总结经验如下:

    (一)安装

    使用前要先打开CxImgLib.dsw,进行编辑成LIB库文件。随后的使用方法如下:

    一、最复杂的方法,功能最好(占空间大):

    "1.将以下几个目录拷贝到与“我新建的项目目录”同一级目录里,比如如下:

    [CxImage]cximage.dsp

    [jasper]jasper.dsp

    [jbig]jbig.dsp

    [jpeg]Jpeg.dsp

    [mng]mng.dsp

    [png]png.dsp

    [raw]libdcr.dsp

    [tiff]Tiff.dsp

    [zlib]zlib.dsp

    [我的项目]"

    2.再将上面的dsp插入到我的项目的workspace中(add project)

    3.VC中的菜单project/dependencies中,将我的项目depend on到其它项目(即其它项目打勾)

    4.VC中的菜单project/setting..中,

     C/C++/- Code Generation/- Use run-time library : 都要选Multithreaded DLL

    C/C++/Precompiled headers :选 not using precompiled headers

    C/C++/Code Generation/ Additional Include Directories:  输入  ../cximage"

    5.VC中的菜单project/set active project,选上我的项目

    6.在我的项目的代码中,要加上#include "ximage.h"

     

    二、最简单的使用方法(占空间小)

    1.将CXIMAGE项目中生成的所有*.lib文件(搜索一下),拷贝到我的项目的目录中:

    ./cximage.lib ./jasper.lib ./jbig.lib ./Jpeg.lib ./libdcr.lib ./mng.lib ./png.lib ./Tiff.lib ./zlib.lib

    注意,这些lib的设置方式要和我的项目的设置方式一致,如都是release版本或者都是debug的版本

    2.将这些lib文件insert到当前项目中即可

    3. 将 cximage目录下面所有的*.h拷到“我的项目的目录”之下

    4.VC中的菜单project/setting..中,

     C/C++/- Code Generation/- Use run-time library : 都要选Multithreaded DLL

    C/C++/Precompiled headers :选 not using precompiled headers"

    5.在我的项目的代码中,要加上#include "ximage.h"

    这样就能在我的项目中正常使用了。

     

    (二)使用

    其它摸索出来的使用:

    创建和删除类对象 CxImage* image;

    每次要用到时,就image = new CxImage();

    然后可以image->Load(....)等操作了

    每次用完时,就delete image;   //不可以 delete *image;"

    从文件加载图像到类中 image.Load("image.bmp", CXIMAGE_FORMAT_BMP);

    保存图像到文件 image.Save("image.jpg",CXIMAGE_FORMAT_JPG)

    判断类中的图像是否有效 "image.IsValid()

    //如果类中没有图像,这个函数返回假;

    //如果先加载一个图像成功,这个函数就返回真;然后再LOAD另一个图像不成功,这个函数返回值仍是真!因为类中的图像仍存在!

     

    从内存加载图像到类中(解码) 

    CxImage* image;

    image = new CxImage();

    image->Decode( (BYTE*)databuf, size, CXIMAGE_FORMAT_PNG );

    delete image;

    //databuf指向的内存地址中已经有一个图像(可以是从图片文件中读出来的),size是图像大小

    //这个函数将这个图像装载到image类中"

     

    将图像保存到内存中(编码) 

    long size="0";

    BYTE* buffer="0";

    image.Encode(buffer,size,image_type);

    ...

    image.FreeMemory(buffer);"

     

    将类中的图像转成HBITMAP句柄 HBITMAP m_bitmap = image.MakeBitmap(hDC);

    //需要一个HDC,可以是HDC hDC = ::GetDC(NULL); 得到的 (最后再::ReleaseDC(NULL,hDC);)

    //也可以是CDC* hdc = m_picture.GetDC();  然后hdc->m_hDC就是HDC了(m_picture是一个PICTURE BOX)"

     

    将类中的图像转成HANDLE HANDLE hDIB = image->CopyToHandle();

    展开全文
  • Cximage的用法

    千次阅读 2012-11-28 20:28:31
    CxImage图像库 CxImage下载地址:http://www.codeproject.com/KB/graphics/cximage/cximage600_full.zip 作者:Davide Pizzolato CxImage简介  CxImage是一个可以简便而快速地打开、保存、...
    CxImage图像库
    

    CxImage下载地址:http://www.codeproject.com/KB/graphics/cximage/cximage600_full.zip

    作者:Davide Pizzolato

    CxImage简介

          CxImage是一个可以简便而快速地打开、保存、显示和转换图像文件的 C++类库,它可以用于MFC,可以打开,保存,显示,转换各种常见格式的图像文件,比如BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K 等格式的文件。可以实现BMP<->JPG,PNG <->TIFF格式等等的互相转换。CxImage不仅可以实现图像文件的类型转换,还可以实现在内存图像数据的类型转换,并且使用很方便。除了文件格式的相互转换,它还提供了很多很多图像后处理的功能,比如图像模糊,锐化等等,功能非常强大和实用。另外,CxImage是开源的,并在zlib许可下发布,“如果你在你的产品中使用了这些源代码,虽然致谢不是必须的,但是却会得到众人的欣赏。”简单地说,你可以随意地使用这些代码,只要你不说它是你自己的就行了。

          CxImage中的x,大约代表了丰富的图像格式支持和丰富的图像处理功能,可以说CxImage是图像处理的十全大补汤。


    用CxImage实现的图像处理程序

          开发环境:VC6, C++, Windows, MFC, Visual Studio, VS6, Dev

          文件格式和链接的库:CxImage支持如下这些库的最新版本:
       Zlib (1.2.3), Jasper ( 1.900.1), LibMNG (1.0.10), LibPNG (1.2.24). LibTIFF 3.8.2
    j2k库(现在被称为openjpeg)和相关的类CxImageJ2K已经从项目中删除。JPEG2000格式的文件由Jasper和CximageJAS来支持。

          Cximage 6.00提供了一个新的类CximageRAW和新的库LibDCR,用于读取来自数码相机的RAW图像。常见的文件扩展名有:RAW, CRW, NEF, CR2, DNG, ORF, ARW, ERF, 3FR, DCR, X3F, MEF, RAF, MRW, PEF, SR2。

          CximageRAW提供了对图像的基本解码功能,它唯一的可选参数可以由SetCodecOption进行设置,以对插值质量进行可控制。可选的选项有(DECODE_QUALITY_LIN=0, DECODE_QUALITY_VNG=1, DECODE_QUALITY_PPG=2, DECODE_QUALITY_AHD=3).

          CximagePNG:现在可以读取所有PNG_COLOR_TYPE_类型。但是,每个通道含有超过8位像素深度的PNG文件,会被转换到8位,这是CxImage的一个主要限制。
          CxImageGIF:现在能够更好地支持对动态GIF图像的读取,通过SetRetreiveAllFrames设置属性,可以同时对图像中的所有帧进行解码。在CxImage的示例项目中,展示了如何实现这一选项,并展示了如何播放一副GIF动画。

          CxImageBMP: 支持对32位图像的读写(支持Alpha通道)

          CxImageICO: 支持对Vista PNG图标的读写;添加对多页图标的支持。

          CxImageMNG: 支持对MNG Alpha图层的读取。
          CxImageSKA: 新的用于支持SKA图像格式的类,这种图像通常用在视频租赁软件中。

          CxImageJPG: 为JPEG图像格式的二次采样提供了 新的选项。ENCODE_SUBSAMPLE_422,ENCODE_SUBSAMPLE_444),默认情况下是 高采样率的4:1:1 。当然,也可以被设置成中等的4:2:2或者低等的4:4:4。

    下图展示了不同采样率下,在压缩图像中所产生的不同数量的伪影。在压缩有着明显轮廓的图像的时候,采用4:4:4的采样率有助于减少轮廓的伪影。

    可移植性

          所有的类和项目都通过了不同编译器的测试,包括从VC++6 到VC++2008的微软系列编译器,Borland C++ Builder 3和6,同时部分地支持wxDev-C++和MinGW。

          所有的库都支持UNICODE 和非UNICODE两个版本。(感谢Eric Jesover)

          对于第一次使用的用户,你可以使用一个轻量级的版本(cximage600_lite)。这个版本去除了C库,但是添加了一个简单的示例项目。
          所有控制台示例(/demo2)和CxImageCrtDll项目可以在VC++Express2005和 Microsoft Platform SDK环境下编译通过。如果你在编译链接的时候,遇到像"unresolved external..."(无法找到外部符号…)这样的错误,请检查是否所有C库都被编译了。或者手动地添加gdi32.lib 和user32.lib为项目的依赖库。

          同时,CxImage也可以在Pocket PC 2003上工作。在CxImage中,为VC++ 2005编译器提供了一个可以工作的版本和相应的实例(cximage600_ce)。对于旧式的嵌入式VC编译器,最主要的限制是无法支持对异常的处理。为了解决这个问题,相应的异常处理语句try,throw和catch已经被定义在ximadef.h中的三个宏取代,同时还定义了CXIMAGE_SUPPORT_EXCEPTION_HANDLING。通过这样的方法,取消对异常处理的支持,可以成功编译链接整个库。虽然这个解决办法不是那么优雅,但是当异常处理被取消的时候,对代码的影响是最小的。同时,当异常处理被启用的时候,同样不会造成源代码的修改与变动。

          对于平台之间little-endian和big-endian的兼容性,对于内建支持的图像文件格式(bmp, ico, tga, pcx, gif, ska),由ntohs和ntohl控制。

          示例
          大多数新的特性可以在CxImage的主要示例程序中尝试和体验。这个示例程序只是一个测试平台,虽然它提供很多有用的特性,但是它实在不是一个严谨的应用程序。

          ·CQuantizer : 这个类被DecreaseBpp菜单项所使用。在以前的版本中,这里有一个取整的错误,在某些情况下,白色(255,255,255)会被转换成(254,254,254)。在新的版本中,这个问题已经被修复了。
          ·Copy/Paste : 现在,新的粘贴功能支持元文件图像(例如,从Office应用程序中复制而来的图像)。这个示例内部使用了自定义的剪切板格式以测试Dump/Undump方法。Copy只工作在当前选区,但是你可以通过CxImage/Remove Selection 复制整幅图像。
          ·FloodFill : (/View/Tools/Flood Fill) 通过一个浮动的对话框,你可以测试色彩填充的颜色,偏差,透明度和是否选择。当透明度为0并且选择区域功能启用的时候,这个功能就变现为"魔法棒",用于根据颜色选区某个区域。
          ·Graph data extraction : (/Filters/graph data extraction) 这个示例演示了如何从图像(从扫描仪获取或者从互联网下载所得)中提取数字信息。转换后的数据被粘贴到剪切板,同时可以被保存成文本文件或者Excel表格文件。

    数据提取对话框


    数据提取结果


          ·RedEyeRemove : (/Filters/Non Linear/Remove Red Eye) 去除红眼的功能在照片处理中经常用到。你 必须在红眼周围选择一个区域,然后去除红眼的功能就会对红色通道进行过滤,从而去掉照片中的红眼。红眼的选区是一个矩形区域,同时可以包括部分的虹膜(眼黑),过滤器会在以选区中点为中心的圆心区域工作,不会影响到选中的眼黑部分。

          ·SelectiveBlur / UnsharpMask : 这些非线性的滤镜可以增加图像的质量。SelectiveBlur可以去除二次噪声(比如JPEG图像中的伪影或者是数码相机的噪声),从而展示图像中的更多细节。而UnsharpMask可以增强图像的细节,但是却不会添加噪声。

          ·Custom linear filters : (/Filters/Linear/Custom) 一个用于测试新的滤镜功能核心的图像用户界面。

          ·Histogram : (/Colors/Histogram/...) 为了测试HistogramStretch(直方图),这个示例中提供了很多菜单项,通过不同的方法(0 = luminance, 1 = linked channels , 2 = independent channels)来测试直方图功能。对于有噪声的图像,阈值(threshold)这个参数增强了算法的健壮性。半饱和度(Half Saturation)和全饱和度(Full Saturation)可以测试转换颜色空间(ConvertColorSpace),直方图(Histogram)和饱和度(Saturate)在YUV颜色空间对直方图的拉伸效果。


          ·Thresholding : ( /Colors/Threshold... and /Colors/Adaptive Threshold). 透明度阈值(OptimalThreshold)是一个新的用于查找二进制图像透明度阈值的新方法。可选的算法有:

      1 = 最大类间方差 (Otsu);
      2 = 基特勒和伊尔林格沃斯(Kittler & Illingworth);
      3 = 最大熵(maximum entropy);
      4 = 位差(potential difference);
      0 = 平均所有方法 (默认情况下,这也是示例程序中所使用的方法);

          "保留低于阈值的颜色"(preserve colors less than the threshold)的选项,将测试Threshold2方法。这对于过滤带有噪声背景的彩色图像很有用。经过处理,我们将得到一幅带有一致背景的彩色图像(噪声被去除)。AdaptiveThreshold是对方法OptimalThreshold的一个应用,它将创建很多阈值模板。AdaptiveThreshold对于有着不一致的灯光照射效果的图像,非常有用。对于这类图像,我们不能简单地在整幅图像中使用某个单一的阈值。但是,如果我们的参数设置得不对,我们将得到一个非常差劲的处理结果。


          ·Add shadow : (/Filters/Add Shadow...) 这个菜单项的功能演示了如何将CxImage的多个小功能(选择(selections),高斯模糊( GaussianBlur),混合( Mix))组合使用,以达到常见的图像处理效果。


          ·Text smoothing : DrawStringEx 实现了一个新的选项CXTEXTINFO::smooth。我们可以通过文本工具(位于/View/Tools/Text),选中抗锯齿("antialias")选项对这个功能进行测试。

          类似的效果也同样可以利用TextBlur (/Filters/Non Linear/Text Blur)进行后处理获得。这是一个非线性的过滤器,它只对角或圆形的边缘起作用,从而不会影响到纵向或横向的线。下图展示了不同平滑方法的实际效果:

     

    CxImage库的结构

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

          连接所有模块和C库的是CxFile。这是一个虚类,它提供了标准的方法,用于访问硬盘或者内存的文件数据。


    CxImage的继承树

          一个CxImage对象基本上对应于一幅位图,同时添加了一些额外的成员变量用于存储一些有用的信息。

    1. class CxImage 
    2. ... 
    3. protected
    4. void* pDib;            // 包含文件头,调色板和像素数据 
    5. BITMAPINFOHEADER head; // 标准文件头  
    6. CXIMAGEINFO info;      // 扩展信息 
    7. BYTE* pSelection;      // 选区 
    8. BYTE* pAlpha;          // alpha通道 
    9. CxImage** ppLayers;    // 普通层  
    10. CxImage** ppFrames;    // 动画帧 
    1. class CxImage 
    2. ... 
    3. protected
    4. void* pDib;            // 包含文件头,调色板和像素数据 
    5. BITMAPINFOHEADER head; // 标准文件头 
    6. CXIMAGEINFO info;      // 扩展信息 
    7. BYTE* pSelection;      // 选区 
    8. BYTE* pAlpha;          // alpha通道 
    9. CxImage** ppLayers;    // 普通层 
    10. CxImage** ppFrames;    // 动画帧 

          CxImage::head 是位图文件的文件头,而CxImage::pDib就是一个普通的位图(就像你在CxImageBMP::Encode中看到的一样)。 
          CxImage::info 是一个方便的信息容器。这些信息被不同的文件格式所共享,同时供所有成员函数访问。

    1. typedef struct  tagCxImageInfo { 
    2.     DWORD   dwEffWidth;       //双字节对齐宽度 
    3.     BYTE*   pImage;           //图像数据 
    4.     void*   pGhost;           //如果这是一个备份(ghost),则pGhost指向它的原始对象  
    5.     DWORD   dwType;           //原始图像格式 
    6.     char    szLastError[256]; //调试信息,最后的错误信息 
    7.     long    nProgress;        //进度 
    8.     long    nEscape;          //取消 
    9.     long    nBkgndIndex;      //GIF, PNG, MNG使用 
    10.     RGBQUAD nBkgndColor;      //RGB透明使用  
    11.     BYTE    nQuality;         //JPEG使用 
    12.     long    nFrame;           //TIF, GIF, MNG使用,表示当前活动帧 
    13.     long    nNumFrames;       //TIF, GIF, MNG使用,表示总帧数                         
    14.     DWORD   dwFrameDelay;     //GIF, MNG使用,表示帧的延迟 
    15.     long    xDPI;             //水平分辨率   
    16.     long    yDPI;             //垂直分辨率   
    17.     RECT    rSelectionBox;    //对象的外包围框 
    18.     BYTE    nAlphaMax;        //最大透明度 
    19.     bool    bAlphaPaletteEnabled;  //如果调色板中的alpha值是启用的,则这个变量为true  
    20.     bool    bEnabled;         //启用绘制函数 
    21.     long    xOffset; 
    22.     long    yOffset; 
    23.     DWORD   dwEncodeOption;   //GIF, TIF使用:0=def.1=unc,2=fax3,3=fax4, 4=pack,5=jpg 
    24.     RGBQUAD last_c;           //用于优化GetNearestIndex 
    25.     BYTE    last_c_index; 
    26.     bool    last_c_isvalid; 
    27.     long    nNumLayers; 
    28.     DWORD   dwFlags; 
    29. } CXIMAGEINFO; 
    1. typedef struct  tagCxImageInfo { 
    2.     DWORD   dwEffWidth;       //双字节对齐宽度 
    3.     BYTE*   pImage;           //图像数据 
    4.     void*   pGhost;           //如果这是一个备份(ghost),则pGhost指向它的原始对象  
    5.     DWORD   dwType;           //原始图像格式 
    6.     char    szLastError[256]; //调试信息,最后的错误信息 
    7.     long    nProgress;        //进度 
    8.     long    nEscape;          //取消 
    9.     long    nBkgndIndex;      //GIF, PNG, MNG使用 
    10.     RGBQUAD nBkgndColor;      //RGB透明使用 
    11.     BYTE    nQuality;         //JPEG使用 
    12.     long    nFrame;           //TIF, GIF, MNG使用,表示当前活动帧 
    13.     long    nNumFrames;       //TIF, GIF, MNG使用,表示总帧数                         
    14.     DWORD   dwFrameDelay;     //GIF, MNG使用,表示帧的延迟 
    15.     long    xDPI;             //水平分辨率   
    16.     long    yDPI;             //垂直分辨率   
    17.     RECT    rSelectionBox;    //对象的外包围框 
    18.     BYTE    nAlphaMax;        //最大透明度 
    19.     bool    bAlphaPaletteEnabled;  //如果调色板中的alpha值是启用的,则这个变量为true  
    20.     bool    bEnabled;         //启用绘制函数 
    21.     long    xOffset; 
    22.     long    yOffset; 
    23.     DWORD   dwEncodeOption;   //GIF, TIF使用:0=def.1=unc,2=fax3,3=fax4, 4=pack,5=jpg 
    24.     RGBQUAD last_c;           //用于优化GetNearestIndex 
    25.     BYTE    last_c_index; 
    26.     bool    last_c_isvalid; 
    27.     long    nNumLayers; 
    28.     DWORD   dwFlags; 
    29. } CXIMAGEINFO; 

          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

          在你的项目中使用CxImage
          如下图所示,CxImgLib.dsw工作空间展示了构建一个包含绝大多数功能和支持大多数图像格式的应用程序(demo.exe)所需要的所有库。你必须先编译所有的库,然后才可以链接你最终的应用程序。

          CxImgLib.dsw工作空间
          在相同的工作空间中,你可以找到用于构建不同库和应用程序的项目:

      ·CxImage : cximage.lib - 静态库
      ·CxImageCrtDll : cximagecrt.dll - DLL,不使用MFC
      ·CxImageMfcDll : cximage.dll - DLL,使用MFC
      ·Demo : 示例程序demo.exe,跟cximage.lib和C库链接。
      ·DemoDll : demodll.exe - 跟cximagecrt.dll链接
      ·libdcr,jasper,jbig,jpeg,png,tiff,zlib : 静态的C库

          构建这些项目需要几分钟时间,当所有项目构建完成后,你可以选择demo项目并执行应用程序。

          要想在你自己的项目中使用CxImage,你必须编辑下面这些项目设置设置(针对Visual C++ 6.0):

      Project Settings(项目设置)

    1. Project Settings 
    2. |- C/C++ 
    3. |   |- Code Generation 
    4. |   |   |- Use run-time library : Multithreaded DLL (must be the same for  
    5. |   |   |  all the linked libraries) 
    6. |   |   |- Struct member alignment : must be the same for all the linked  
    7. |   |   |  libraries 
    8. |   |- Precompiled headers : not using precompiled headers 
    9. |   |- Preprocessor 
    10. |       |- Additional Include Directories:  ../cximage 
    11. |- Link 
    12.     |- General 
    13.         |- Object/library modules: ../png/Debug/png.lib   
    14.                                    ../raw/Debug/libdcr.lib 
    15.                                    ../jpeg/Debug/jpeg.lib  
    16.                                    ../zlib/Debug/zlib.lib  
    17.                                    ../tiff/Debug/tiff.lib 
    18.                                    ../jasper/Debug/jasper.lib 
    19.                                    ../cximage/Debug/cximage.lib  ... 
    1. Project Settings 
    2. |- C/C++ 
    3. |   |- Code Generation 
    4. |   |   |- Use run-time library : Multithreaded DLL (must be the same for  
    5. |   |   |  all the linked libraries) 
    6. |   |   |- Struct member alignment : must be the same for all the linked  
    7. |   |   |  libraries 
    8. |   |- Precompiled headers : not using precompiled headers 
    9. |   |- Preprocessor 
    10. |       |- Additional Include Directories:  ../cximage 
    11. |- Link 
    12.     |- General 
    13.         |- Object/library modules: ../png/Debug/png.lib   
    14.                                    ../raw/Debug/libdcr.lib 
    15.                                    ../jpeg/Debug/jpeg.lib  
    16.                                    ../zlib/Debug/zlib.lib  
    17.                                    ../tiff/Debug/tiff.lib 
    18.                                    ../jasper/Debug/jasper.lib 
    19.                                    ../cximage/Debug/cximage.lib  ... 

          在你的源代码中,你必须引入CxImage的头文件ximage.h。在你的代码中添加如下语句:#include "ximage.h"。
          注意,不要混合debug和release模块,每个配置必须使用各自相应的库文件。

          在CxImage中添加自定义的函数
          为CxImage添加一个新的图像处理函数并不困难。在这里,我将以CxImage::Jitter为例子,描述如何为CxImage添加自定义的函数。虽然这个函数很简单, 但是它却展示了使用CxImage时所需要注意的方方面面。

          首先,我们需要声明这个函数:

    1. bool Jitter(long radius=2) 
    1. bool Jitter(long radius=2) 

          在ximage.h头文件的CXIMAGE_SUPPORT_DSP部分,你可以在public区域的任何部分声明这个函数。

          现在,我们开始定义这个函数:

    [c-sharp] view plaincopy
    1. bool CxImage::Jitter(long radius) 
    2.     // 检查图像是否合法,这应当是这个函数的第一行  
    3.     if (!pDib) return false
    4.      
    5.     // 局部变量  
    6.     long nx,ny; 
    7.      
    8.     // 临时图像,用于存储算法的部分结果  
    9.     CxImage tmp(*this,pSelection!=0,true,true); 
    10.      
    11.     // 限制函数仅仅作用在选区(通过Selection...()函数定义)的最小区域 
    12.     // 这将加快整个循环的速度,提高算法效率  
    13.     long xmin,xmax,ymin,ymax; 
    14.     if (pSelection){ 
    15.         xmin = info.rSelectionBox.left; xmax = info.rSelectionBox.right; 
    16.         ymin = info.rSelectionBox.bottom; ymax = info.rSelectionBox.top; 
    17.     } else
    18.         xmin = ymin = 0; 
    19.         xmax = head.biWidth; ymax=head.biHeight; 
    20.     } 
    21.      
    22.     // 主循环 : 垂直方向扫描图像  
    23.     for(long y=ymin; y <ymax; y++){ 
    24.      
    25.         // 监视循环的进度  
    26.         info.nProgress = (long)(100*y/head.biHeight); 
    27.      
    28.         // 检查应用程序是否已经退出  
    29.         if (info.nEscape) break
    30.      
    31.         // 主循环 : 水平方向扫描图像  
    32.         for(long x=xmin; x<xmax; x++){ 
    33.      
    34.         // 如果选区功能启用了,则仅仅处理选区内部的像素
    35. #if CXIMAGE_SUPPORT_SELECTION  
    36.             if (SelectionIsInside(x,y))
    37. #endif //CXIMAGE_SUPPORT_SELECTION  
    38.             { 
    39.                 // 主算法  
    40.                 nx=x+(long)((rand()/(float)RAND_MAX - 0.5)*(radius*2)); 
    41.                 ny=y+(long)((rand()/(float)RAND_MAX - 0.5)*(radius*2)); 
    42.                 if (!IsInside(nx,ny)) { 
    43.                     nx=x; 
    44.                     ny=y; 
    45.                 } 
    46.  
    47.                 // 保存结果到临时图像中.  
    48.                 // 如果可以,24位图像请使用PixelColor, 
    49.                 // 而8,4和1位图像请使用PixelIndex,这样可以加快速度。 
    50.                 if (head.biClrUsed==0){ 
    51.                     tmp.SetPixelColor(x,y,GetPixelColor(nx,ny)); 
    52.                 } else
    53.                     tmp.SetPixelIndex(x,y,GetPixelIndex(nx,ny)); 
    54.                 } 
    55.  
    56.                 // 如果启用了透明度功能,则处理透明图层中的像素
    57. #if CXIMAGE_SUPPORT_ALPHA  
    58.                 tmp.AlphaSet(x,y,AlphaGet(nx,ny));
    59. #endif //CXIMAGE_SUPPORT_ALPHA  
    60.  
    61.             } 
    62.         } 
    63.     } 
    64.  
    65.     // 保存结果并退出  
    66.     Transfer(tmp); 
    67.     return true
    [c-sharp] view plaincopy
    1. bool CxImage::Jitter(long radius) 
    2.     // 检查图像是否合法,这应当是这个函数的第一行 
    3.     if (!pDib) return false
    4.      
    5.     // 局部变量 
    6.     long nx,ny; 
    7.      
    8.     // 临时图像,用于存储算法的部分结果 
    9.     CxImage tmp(*this,pSelection!=0,true,true); 
    10.      
    11.     // 限制函数仅仅作用在选区(通过Selection...()函数定义)的最小区域 
    12.     // 这将加快整个循环的速度,提高算法效率 
    13.     long xmin,xmax,ymin,ymax; 
    14.     if (pSelection){ 
    15.         xmin = info.rSelectionBox.left; xmax = info.rSelectionBox.right; 
    16.         ymin = info.rSelectionBox.bottom; ymax = info.rSelectionBox.top; 
    17.     } else
    18.         xmin = ymin = 0; 
    19.         xmax = head.biWidth; ymax=head.biHeight; 
    20.     } 
    21.      
    22.     // 主循环 : 垂直方向扫描图像 
    23.     for(long y=ymin; y <ymax; y++){ 
    24.      
    25.         // 监视循环的进度 
    26.         info.nProgress = (long)(100*y/head.biHeight); 
    27.      
    28.         // 检查应用程序是否已经退出 
    29.         if (info.nEscape) break
    30.      
    31.         // 主循环 : 水平方向扫描图像 
    32.         for(long x=xmin; x<xmax; x++){ 
    33.      
    34.         // 如果选区功能启用了,则仅仅处理选区内部的像素 
    35. #if CXIMAGE_SUPPORT_SELECTION 
    36.             if (SelectionIsInside(x,y)) 
    37. #endif //CXIMAGE_SUPPORT_SELECTION 
    38.             { 
    39.                 // 主算法 
    40.                 nx=x+(long)((rand()/(float)RAND_MAX - 0.5)*(radius*2)); 
    41.                 ny=y+(long)((rand()/(float)RAND_MAX - 0.5)*(radius*2)); 
    42.                 if (!IsInside(nx,ny)) { 
    43.                     nx=x; 
    44.                     ny=y; 
    45.                 } 
    46.  
    47.                 // 保存结果到临时图像中. 
    48.                 // 如果可以,24位图像请使用PixelColor, 
    49.                 // 而8,4和1位图像请使用PixelIndex,这样可以加快速度。 
    50.                 if (head.biClrUsed==0){ 
    51.                     tmp.SetPixelColor(x,y,GetPixelColor(nx,ny)); 
    52.                 } else
    53.                     tmp.SetPixelIndex(x,y,GetPixelIndex(nx,ny)); 
    54.                 } 
    55.  
    56.                 // 如果启用了透明度功能,则处理透明图层中的像素  
    57. #if CXIMAGE_SUPPORT_ALPHA 
    58.                 tmp.AlphaSet(x,y,AlphaGet(nx,ny)); 
    59. #endif //CXIMAGE_SUPPORT_ALPHA 
    60.  
    61.             } 
    62.         } 
    63.     } 
    64.  
    65.     // 保存结果并退出 
    66.     Transfer(tmp); 
    67.     return true

    示例:

    如何转换一种格式到另外一种格式

    1. CxImage  image; 
    2. // bmp -> jpg  
    3. image.Load("image.bmp", CXIMAGE_FORMAT_BMP); 
    4. if (image.IsValid()){ 
    5.     if(!image.IsGrayScale()) image.IncreaseBpp(24); 
    6.     image.SetJpegQuality(80); 
    7.     image.Save("image.jpg",CXIMAGE_FORMAT_JPG); 
    8. // png -> tif  
    9. image.Load("image.png", CXIMAGE_FORMAT_PNG); 
    10. if (image.IsValid()){ 
    11.     image.Save("image.tif",CXIMAGE_FORMAT_TIF); 
    1. CxImage  image; 
    2. // bmp -> jpg 
    3. image.Load("image.bmp", CXIMAGE_FORMAT_BMP); 
    4. if (image.IsValid()){ 
    5.     if(!image.IsGrayScale()) image.IncreaseBpp(24); 
    6.     image.SetJpegQuality(80); 
    7.     image.Save("image.jpg",CXIMAGE_FORMAT_JPG); 
    8. // png -> tif 
    9. image.Load("image.png", CXIMAGE_FORMAT_PNG); 
    10. if (image.IsValid()){ 
    11.     image.Save("image.tif",CXIMAGE_FORMAT_TIF); 

    如何从资源中加载图像

    1. //Load the resource IDR_PNG1 from the PNG resource type 
    2. CxImage* newImage = new CxImage(); 
    3. newImage->LoadResource(FindResource(NULL,MAKEINTRESOURCE(IDR_PNG1), 
    4.                        "PNG"),CXIMAGE_FORMAT_PNG); 
    5.  
    6. //Load the resource IDR_JPG1 from DLL  
    7. CxImage* newImage = new CxImage(); 
    8. HINSTANCE hdll=LoadLibrary("imagelib.dll"); 
    9. if (hdll){ 
    10.     HRSRC hres=FindResource(hdll,MAKEINTRESOURCE(IDR_JPG1),"JPG"); 
    11.     newImage->LoadResource(hres,CXIMAGE_FORMAT_JPG,hdll); 
    12.     FreeLibrary(hdll); 
    13.  
    14. //Load a bitmap resource;  
    15. HBITMAP bitmap = ::LoadBitmap(AfxGetInstanceHandle(), 
    16.                            MAKEINTRESOURCE(IDB_BITMAP1))); 
    17. CxImage *newImage = new CxImage(); 
    18. newImage->CreateFromHBITMAP(bitmap); 
    1. //Load the resource IDR_PNG1 from the PNG resource type 
    2. CxImage* newImage = new CxImage(); 
    3. newImage->LoadResource(FindResource(NULL,MAKEINTRESOURCE(IDR_PNG1), 
    4.                        "PNG"),CXIMAGE_FORMAT_PNG); 
    5.  
    6. //Load the resource IDR_JPG1 from DLL 
    7. CxImage* newImage = new CxImage(); 
    8. HINSTANCE hdll=LoadLibrary("imagelib.dll"); 
    9. if (hdll){ 
    10.     HRSRC hres=FindResource(hdll,MAKEINTRESOURCE(IDR_JPG1),"JPG"); 
    11.     newImage->LoadResource(hres,CXIMAGE_FORMAT_JPG,hdll); 
    12.     FreeLibrary(hdll); 
    13.  
    14. //Load a bitmap resource; 
    15. HBITMAP bitmap = ::LoadBitmap(AfxGetInstanceHandle(), 
    16.                            MAKEINTRESOURCE(IDB_BITMAP1))); 
    17. CxImage *newImage = new CxImage(); 
    18. newImage->CreateFromHBITMAP(bitmap); 

          如何解码内存中的图像

    [c-sharp] view plaincopy
    1. CxImage image((BYTE*)buffer,size,image_type); 
    2.  
    3. CxMemFile memfile((BYTE*)buffer,size); 
    4. CxImage image(&memfile,image_type); 
    5.  
    6. CxMemFile memfile((BYTE*)buffer,size); 
    7. CxImage* image = new CxImage(); 
    8. image->Decode(&memfile,type); 
    [c-sharp] view plaincopy
    1. CxImage image((BYTE*)buffer,size,image_type); 
    2.  
    3. CxMemFile memfile((BYTE*)buffer,size); 
    4. CxImage image(&memfile,image_type); 
    5.  
    6. CxMemFile memfile((BYTE*)buffer,size); 
    7. CxImage* image = new CxImage(); 
    8. image->Decode(&memfile,type); 

    如何对内存中的图像编码

    1. long size=0; 
    2. BYTE* buffer=0; 
    3. image.Encode(buffer,size,image_type); 
    4. ... 
    5. image.FreeMemory(buffer); 
    6.  
    7. CxMemFile memfile; 
    8. memfile.Open(); 
    9. image.Encode(&memfile,image_type); 
    10. BYTE* buffer = memfile.GetBuffer(); 
    11. long size = memfile.Size(); 
    12. ... 
    13. image.FreeMemory(buffer); 
    1. long size=0; 
    2. BYTE* buffer=0; 
    3. image.Encode(buffer,size,image_type); 
    4. ... 
    5. image.FreeMemory(buffer); 
    6.  
    7. CxMemFile memfile; 
    8. memfile.Open(); 
    9. image.Encode(&memfile,image_type); 
    10. BYTE* buffer = memfile.GetBuffer(); 
    11. long size = memfile.Size(); 
    12. ... 
    13. image.FreeMemory(buffer); 

    如何创建一副多页的TIFF

    [c-sharp] view plaincopy
    1. CxImage *pimage[3]; 
    2. pimage[0]=&image1; 
    3. pimage[1]=&image2; 
    4. pimage[2]=&image3; 
    5. FILE* hFile; 
    6. hFile = fopen("multipage.tif","w+b"); 
    7. CxImageTIF multiimage; 
    8. multiimage.Encode(hFile,pimage,3); 
    9. fclose(hFile); 
    10.  
    11. FILE* hFile; 
    12. hFile = fopen("c://multi.tif","w+b"); 
    13. CxImageTIF image; 
    14. image.Load("c://1.tif",CXIMAGE_FORMAT_TIF); 
    15. image.Encode(hFile,true); 
    16. image.Load("c://2.bmp",CXIMAGE_FORMAT_BMP); 
    17. image.Encode(hFile,true); 
    18. image.Load("c://3.png",CXIMAGE_FORMAT_PNG); 
    19. image.Encode(hFile); 
    20. fclose(hFile); 
    [c-sharp] view plaincopy
    1. CxImage *pimage[3]; 
    2. pimage[0]=&image1; 
    3. pimage[1]=&image2; 
    4. pimage[2]=&image3; 
    5. FILE* hFile; 
    6. hFile = fopen("multipage.tif","w+b"); 
    7. CxImageTIF multiimage; 
    8. multiimage.Encode(hFile,pimage,3); 
    9. fclose(hFile); 
    10.  
    11. FILE* hFile; 
    12. hFile = fopen("c://multi.tif","w+b"); 
    13. CxImageTIF image; 
    14. image.Load("c://1.tif",CXIMAGE_FORMAT_TIF); 
    15. image.Encode(hFile,true); 
    16. image.Load("c://2.bmp",CXIMAGE_FORMAT_BMP); 
    17. image.Encode(hFile,true); 
    18. image.Load("c://3.png",CXIMAGE_FORMAT_PNG); 
    19. image.Encode(hFile); 
    20. fclose(hFile); 

    如何复制和粘贴图像

    [c-sharp] view plaincopy
    1. //复制(copy)  
    2. HANDLE hDIB = image->CopyToHandle(); 
    3. if (::OpenClipboard(AfxGetApp()->m_pMainWnd->GetSafeHwnd())) { 
    4.     if(::EmptyClipboard()) { 
    5.         if (::SetClipboardData(CF_DIB,hDIB) == NULL ) { 
    6.             AfxMessageBox( "Unable to set Clipboard data" ); 
    7. }    }    } 
    8. CloseClipboard(); 
    9.  
    10. //粘贴(paste)  
    11. HANDLE hBitmap=NULL; 
    12. CxImage *newima = new CxImage(); 
    13. if (OpenClipboard()) hBitmap=GetClipboardData(CF_DIB); 
    14. if (hBitmap) newima->CreateFromHANDLE(hBitmap); 
    15. CloseClipboard(); 
    [c-sharp] view plaincopy
    1. //复制(copy) 
    2. HANDLE hDIB = image->CopyToHandle(); 
    3. if (::OpenClipboard(AfxGetApp()->m_pMainWnd->GetSafeHwnd())) { 
    4.     if(::EmptyClipboard()) { 
    5.         if (::SetClipboardData(CF_DIB,hDIB) == NULL ) { 
    6.             AfxMessageBox( "Unable to set Clipboard data" ); 
    7. }    }    } 
    8. CloseClipboard(); 
    9.  
    10. //粘贴(paste) 
    11. HANDLE hBitmap=NULL; 
    12. CxImage *newima = new CxImage(); 
    13. if (OpenClipboard()) hBitmap=GetClipboardData(CF_DIB); 
    14. if (hBitmap) newima->CreateFromHANDLE(hBitmap); 
    15. CloseClipboard(); 

    如何在图片框控件(Picture Box)中显示图像

    1. HBITMAP m_bitmap = NULL; 
    2. CxImage image("myfile.png", CXIMAGE_FORMAT_PNG); 
    3. ... 
    4. CDC* hdc = m_picture.GetDC(); 
    5. HBITMAP m_bitmap = image.MakeBitmap(hdc->m_hDC); 
    6. HBITMAP hOldBmp = m_picture.SetBitmap(m_bitmap); 
    7. if (hOldBmp) DeleteObject(hOldBmp); 
    8. if (hdc->m_hDC) m_picture.ReleaseDC(hdc); 
    9. ... 
    10. if (m_bitmap) DeleteObject(m_bitmap); 
    1. HBITMAP m_bitmap = NULL; 
    2. CxImage image("myfile.png", CXIMAGE_FORMAT_PNG); 
    3. ... 
    4. CDC* hdc = m_picture.GetDC(); 
    5. HBITMAP m_bitmap = image.MakeBitmap(hdc->m_hDC); 
    6. HBITMAP hOldBmp = m_picture.SetBitmap(m_bitmap); 
    7. if (hOldBmp) DeleteObject(hOldBmp); 
    8. if (hdc->m_hDC) m_picture.ReleaseDC(hdc); 
    9. ... 
    10. if (m_bitmap) DeleteObject(m_bitmap); 


          译后序:

          关于图像处理库,我相信大家有一个共同的疑问:这么多图像处理库,我该如何选择?在CSDN的blog中有这样一段文字,比较透彻地回答了这个问题,感谢作者的透彻解释:

          "CxImage类库是一 个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说,有那么多优秀的图形库,如OpenIL,FreeImage, PaintLib等等,它们可谓是功能强大,齐全,没必要用其它的类库。但我要说,这些类库基本上没有免费的,使用这些类库,你要被这样那样的许可协议所 束缚。

          在这点上,CxImage类库是完全免费的。另外,在使用上述类库时,你会遇到重重麻烦。因为它们大部分是平台无关的,且用C语言写成,有的还夹杂 着基本的C++ wrapper和成堆德编译选项的声明需要你去处理。而CxImage类库在这方面做得很好。还有让我最看好的,就是作者完全公开了源代码。相对于那些封 装好的图形库和GDI+来说,这一点使我们可以进一步学习各种编解码技术,而不再浮于各种技术的表面。"

    展开全文
  • 此为已经用VS2015编译好的CxImage702资源,亲测能够完成配置!
  • CxImage 6.00 完整版

    2019-04-26 10:00:26
    CxImage是一个优秀的图像操作类库,CodeProject网站打开比较费劲,可以在这里下载。
  • CxImage的使用以及基本用法

    千次阅读 2015-11-16 23:22:04
    基本定义:CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。 下载地址:http://www.codeproject.com/KB/graphics/cximage.aspx 配置环境: 1、拷贝CxImage到项目目录  a、...

    基本定义:CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。

    下载地址:http://www.codeproject.com/KB/graphics/cximage.aspx

    配置环境:


    1、拷贝CxImage到项目目录

         a、编译CxImage

         b、cximage600_full\CxImage:所有的头文件和源文件

         c、查找所有的lib

     

    2、添加头文件目录

           CxImage\Include

    3、添加库文件目录

           CxImage\lib

    3、添加链接
    cximage.lib
    demod.lib
    j2k.lib
    jasper.lib
    jbig.lib
    jpeg.lib
    png.lib
    tiff.lib
    zlib.lib


    4、程序中添加头文件

       #include "ximage.h"

     

    基本用法

         打开:

    CxImage image;
     
    if(image.load("name",类型))
     
    {
           CDC *pDC = GetDC();
           image.Draw(pDC->GetSafeHDC(),CRect rect(0,0,100,100));
           pDC->DeleteDC;    
            
    }

      

         旋转:

    CxImage smallImage;//旋转后的图片
     
    image.Rotate(90,&smallImage);//旋转90,并且保存到smallImage中
     
    smallImage.Save(保存的名字,类型);

         镜像:

    CxImage ImgTmp = image;
     
    if(ImgTmp.Mirror())
     
    {
     
         image.Draw(....  ,  .....);
     
    }

     

         缩放:

    CxImage samllImg;
     
    image.Resample(新宽度,新高度,0,&smallImg);
     
    smallImg.Save("自定第一大小.jpg",CXIMAGE_SUPPORT_JPG);

      剪辑:

    CDC *pDC=GetDC();
     
    UpdateData();
     
    CxImage smallImg;
     
    tempimage.Crop(CRect(m_xTop,m_yTop,m_xWidth,m_yHeiht),&smallImg);
            smallImg.Save("剪辑图片.jpg",CXIMAGE_SUPPORT_JPG);
     
     
     
    smallImg.Draw(pDC->GetSafeHdc(),CRect(40,70,picwidth,picheight));
            pDC->DeleteDC();

      混合:

    CDC *pDC=GetDC();
     
     
    CxImage smallImg;
     
    smallImg.Load("混合源文件.jpg",CXIMAGE_SUPPORT_JPG);
     
    tempimage.Mix(smallImg,CxImage::OpAvg,0,0,true);
     
    tempimage.Save("Mix混合.jpg",CXIMAGE_SUPPORT_JPG);
     
     
    tempimage.Draw(pDC->GetSafeHdc(),CRect(40,70,picwidth,picheight));

    展开全文
  • 在网上下载了cximage的7.02版本,用VS2017打开,遇到一些编译错误,把解决过程记录下来。 1、我打开的是CxImageFull_vc10.sln文件,编译CxImageFull_vc10.sln需要MFC开发环境(Console和Console_vc10可以不需要),...
  • CxImage入门教程,图文并茂

    千次阅读 2014-11-16 11:16:03
    CxImage是C++实现的功能强大的、能处理多种文件格式的图像管理类。它能够简单快速的实现图像的导入、保存、显示和变换。同时又具有平台无关,免费开源,支持多种图片格式几何操作、图像处理、图像格式转换等优点。...
  • 最好用图像处理库CxImage入门

    万次阅读 2014-01-26 14:44:52
    CxImage是一款免费的、开源的、功能强大的图形处理库。跨平台,支持windows、linux等;支持BMP、GIF、ICO、TGA、JPEG、PCX、PNG、TIFF、MNG、RAS等多种图像格式;支持格式转换、图像处理、几何变换等;最重要的是...
  • cximage函数总结

    千次阅读 2019-06-28 16:24:29
    1、加载图片Load():bool Load(const TCHAR* filename, uint32_t imagetype=0); 参数1:图片名字 参数2:图片格式(下面列举) 以下是所有类型枚举: --------------------------------------------------------------...
  • CxImage的编译及简单使用举例

    万次阅读 2014-08-24 13:38:34
    1、 从http://sourceforge.net/projects/cximage/下载最新的CxImage 702源码; 2、 解压缩后,以管理员身份打开CxImageFull_vc10.sln工程,在编译之前先将每个工程属性的Character Set由原先的Use Unicode ...
  • CxImage

    千次阅读 2012-10-16 18:12:48
    Download full source files - 2.52 MB Download executable demo - 710.26 KB  Preface Years after the previous version, I can tell that the article has survived its author, and even if my opinion
  • cximage

    千次阅读 2012-02-14 12:10:18
    CxImage是一个可以用于MFC 的C++图像处理类库类,它可以打开,保存,显示,转换各种常见格式的图像文件,比如BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K 等格式的文件。可以实现BMPJPG,...
  • CXimage

    2013-04-24 16:27:21
    先吃饭去,回来写个总结吧。 昨天偷懒,今天写总结。 字写得有点小,看着比较费力气的Ctrl+鼠标滑轮 ————————————————————————————...cximage600_full,这个包用vs2005打开,首先转换
  • 包括了个人Cximage最新源代码和demo程序,以及个人收集的一些cximage使用入门和注意事项的说明文档。 CxImage类库是一 个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。虽然有那么多优秀的图形库,如...
  • cximage介绍

    千次阅读 2007-08-28 01:40:00
    cximage介绍 PrefaceCxImage grew together with the CodeProject site, since 2001, and reached this level thanks to the CodeProject community. Thanks a lot for the suggestions, the contributions an
  • CxImage图像处理类库

    2017-03-29 15:22:38
     CxImage是一个可以用于MFC 的C++图像处理类库类,它可以打开,保存,显示,转换各种常见格式的图像文件,比如BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K 等格式的文件。可
  • cximage使用说明

    千次阅读 2013-02-04 17:37:37
    CxImage类库简介   这只是翻译了CxImage开源项目主页上的部分简介及简单使用。   CxImage类库是一 个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说,有那么多优秀的图形库,如...
  • CxImage图像库的使用

    千次阅读 2013-03-15 15:36:58
    CxImage下载地址:http://www.codeproject.com/KB/graphics/cximage/cximage600_full.zip作者:Davide PizzolatoCxImage简介CxImage是一个可以简便而快速地打开、保存、显示和转换图像文件的 C++类库,它可以用于MFC...
  • CxImage的简单用法

    2012-05-18 09:51:01
    CxImage的简单用法 http://www.cnblogs.com/lancidie/archive/2011/06/09/2076100.html 好了,我来说明一下这个CxImage类的简单用法,希望给刚接触CxImage的朋友带来一些帮助,首先我要说明的是在这里...
  • CxImage 简单配置与使用

    千次阅读 2013-03-15 14:01:46
    CxImage 简单配置与使用如果本篇文章还不能解决你在生成解决方案以及便宜过程中的问题 请参阅:http://blog.csdn.net/afterwards_/article/details/7997385 我个人配置过来成功运行的经验.CxImage是一个十分强大的...

空空如也

1 2 3 4 5 ... 20
收藏数 3,331
精华内容 1,332
热门标签
关键字:

cximage