CxImage库学习体会之一

来源:互联网 发布:加工中心手工编程 编辑:程序博客网 时间:2024/05/17 12:02

以前见别人使用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 hereCxImage image;// bmp -> jpgimage.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文件哟.