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