以前见别人使用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文件哟.