CxImage使用介绍

    xiaoxiao2021-03-25  19

     

    配置环境

    1、拷贝CxImage到项目目录

    编译CxImagecximage600_full\CxImage:所有的头文件和源文件查找所有的lib

    2、添加头文件目录

    CxImage\Include

    3、添加库文件目录

    CxImage\lib

    4、添加链接

    cximage.lib demod.lib j2k.lib jasper.lib jbig.lib jpeg.lib png.lib tiff.lib zlib.lib

    5、程序中添加头文件

    #include "ximage.h"

    基本用法

    打开图像

    CxImage image; if(image.load("name", 类型)){   CDC *pDC = GetDC();   image.Draw(pDC->GetSafeHDC(),CRectrect(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,CxImageOpAvg,0,0,true); tempimage.Save("Mix混合.jpg",CXIMAGE_SUPPORT_JPG); tempimage.Draw(pDC->GetSafeHdc(),CRect(40,70,picwidth,picheight));

    提示:因为代码是我临时敲上去的,所以并不是通过编译的源代码,不过这里也只是指出CxImage的基本用法,学习方法不要复制粘贴,动手敲的才是属于你自己的。

    编译CxImage类库相关说明

    作者提供的工程文件CxImgLib.dsw (VC++6.0)非常大。如果你只需要能处理其中的几种格式,编译该类库时,你可以在配置的头文件ximcfg.h 中找到一些编译开关选项来关闭一些图像库。JPG、PNG、TIFF中的每一个库,都会向最终程序增加约100KB的内容。

    而CxImage类库压缩后只有约60KB。所以,你需要谨慎挑选一些你真正需要的类库。

    //类库配置文件:ximacfg.h #define CXIMAGE_SUPPORT_JPG 1 //如果要实现bmp->jpg 则必须打开 #define CXIMAGE_SUPPORT_BMP 1 #define CXIMAGE_SUPPORT_GIF 1 #define CXIMAGE_SUPPORT_JPG 1 //以上为必须打开,下面的随便 #define CXIMAGE_SUPPORT_PNG 0//不使用它 #define CXIMAGE_SUPPORT_MNG 0 #define CXIMAGE_SUPPORT_ICO 1 #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_J2K 0 // Beta, use JP2 #define CXIMAGE_SUPPORT_JBG 0 //.............

    各工程的作用对应如下:

    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类库进行图像类型转换,在你的VC工程中使用这个类库,要对工程进行如下设置(Project Settings):

    |- C/C++ |   |- Code Generation |   |   |- Use run-time library : Multithreaded DLL (must be the same for |   |   | all the linked libraries) //应该只要是多线程DLL即可,DEBUG的也行 |   |   |- Struct member alignment : must be the same for all the linked libraries |   |- Precompiled headers : not using precompiled headers |   |- Preprocessor |       |- Additional Include Directories: ..\cximage

    该处填CxImage里的.h和.cpp文件拷贝并导入工程后所在的文件夹,填写后在工程中include时编译器会查找该文件夹,故include的文件无需路径)

    |- Link     |- General         |- Object/library modules: png.lib                                    jpeg.lib                                    zlib.lib                                    tiff.lib                                    jasper.lib                                    cximage.lib

    把需要的lib文件从CxImage中拷贝到工程中的lib文件所在的目录)

    并且从CxImage中将xfile.h、ximacfg.h、ximadef.h、ximage.cpp、ximage.h、xiofile.h、 xmemfile.cpp、xmemfile.h拷贝到工程文件夹下并将CxImage.h文件加入工程中即可。也可以设置vc6的”tools”中的 “include”路径.

    下面介绍应用它进行图像类型转换的方式:

    1.从一种图像文件类型转换为另一种文件类型(convert from a format to another)

    CxImage image;   // 定义一个CxImage对象 // 从bmp文件转换为jpg文件(bmp -> jpg) image.Load("image.bmp", CXIMAGE_FORMAT_BMP);   //先装载bmp文件,需要指定文件类型     // 判断加载的bmp文件是否存在。 if (image.IsValid())......{        // Returns true if the image has 256 colors and a linear grey scale palette.     if(!image.IsGrayScale()) image.IncreaseBpp(24);   // param nbit: 4, 8, 24     image.SetJpegQuality(99);                // 设置图像的压缩质量参数(从0到100,数值越大,质量越高)     image.Save("image.jpg",CXIMAGE_FORMAT_JPG);          // 把压缩后的图像以jpg文件类型保存起来。 } // 从png文件转换为tif文件(png -> tif) image.Load("image.png", CXIMAGE_FORMAT_PNG); if (image.IsValid())...{     image.Save("image.tif",CXIMAGE_FORMAT_TIF); }

    2.加载程序资源图像(load an image resource)

    即从程序的资源图像中构建CxImage对象,有如下几种方式:

    // 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);

    或者

    //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); }

    或者

    //Load a bitmap resource; HBITMAP bitmap = ::LoadBitmap(AfxGetInstanceHandle(),                               MAKEINTRESOURCE(IDB_BITMAP1))); CxImage *newImage = new CxImage(); newImage->CreateFromHBITMAP(bitmap);

    3.在内存缓冲中的图像类型转换

    A.把内存缓冲中的数据解码成一个Image对象(decode an image from memory),有如下几种方式:

    CxImage image((BYTE*)buffer,size,image_type);//把内存缓冲buffer中的数据构造成Image对象

    //或:

    CxMemFile memfile((BYTE*)buffer,size); // 显式使用CxMemFile对象 CxImage image(&memfile,image_type);

    //或:

    CxMemFile memfile((BYTE*)buffer,size); CxImage* image = new CxImage(); image->Decode(&memfile,type);

    A.把Image编码存放到内存缓冲中(encode an image in memory)

    long size=0;//得到图像大小 BYTE* buffer=0;//存储图像数据的缓冲 image.Encode(buffer,size,image_type);//把image对象中的图像以type类型数据copy到buffer free(buffer);

    或:

    CxMemFile memfile; // 显式使用CxMemFile对象 memfile.Open(); image.Encode(&memfile,image_type); BYTE* buffer = memfile.GetBuffer(); long size = memfile.Size(); free(buffer);

    4.处理系统粘贴板中的图像(copy/paste an image)

    //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();

    5.在picture box中显示一个png格式的文件

    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对象是一个扩展了的位图。作者只是在位图结构上添加了一些起存储信息作用的成员变量。一个CxImage对象(同时)也是一组层。每个层只有在需要时才会分配相应的缓冲区。CxImage::pDib代表着背景图像,CxImage::pAlpha代表着透明层,CxImage:: pSelection代表着被选中的层,被用来创建图像处理时让用户感兴趣的区域。

    在这三个特殊层面的基础上,你可以增加一些额外的层,这些层可以存储在 CxImage::pLayers中。一般说来,层是一个完整的CxImage对象。因此,你可以构造很复杂的嵌套层。下面是CxImage的一些成员变量:

    class CxImage{     protected:     void* pDib;            //包含文件头,调色板等等     BITMAPINFOHEADER head; //标准的文件头(位图)     CXIMAGEINFO info;      //扩展了的信息     BYTE* pSelection;      //用户选中的区域     BYTE* pAlpha;          //alpha通道     CxImage** pLayers;     //通用层 }; typedef struct tagCxImageInfo{     DWORD   dwEffWidth;       //DWORD 扫描线宽     BYTE*   pImage;           //图像位数     void*   pGhost;           //if this is a ghost, pGhost point to the body     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通道则为真     bool    bEnabled;         //打开绘图函数     long    xOffset;     long    yOffset;     DWORD   dwEncodeOption;   //一些编码选项     RGBQUAD last_c;           //一些优化选项     BYTE    last_c_index;     bool    last_c_isvalid;     long    nNumLayers;     DWORD   dwFlags; } CXIMAGEINFO;

     

    转载请注明原文地址: https://ju.6miu.com/read-300291.html

    最新回复(0)