说实话CxImage,真是配置起来很麻烦。试验了网上说的好几种办法,都不行。我都想开骂了。折腾一天,找到一个哥们的blog,按照他说的配好了
(我因为要在2008下开发,最好还是用2008来编译CxImage,网上很多教程都是很老的6.0下编译的,通用性不够会有很多问题,我之前折腾一天,不成功,也可能有这个方面的原因)
基本过程是:
1. 下载。。。 (最新的是cximage600_full)
2. 用vs2008打开源码工程。。
3. 一些必要设置,很重要:
有4个模式,其中切换到debug和unicode debug模式下,
修改如下设置:
对于目录下的13个项目,都要设置,分别是
属性->C/C++->常规->调试信息格式:修改为 程序数据库(/Zi)
属性->链接器->常规->启用增量连接:修改为 否(/INCREMENTAL:NO)
对于13个项目的debug和unicode模式都要修改
不修改的话中间可能会出现这种错误:LINK : fatal error LNK1000: Internal error during IncrBuildImage
补充:另外2个模式release和un release不用管,你懂得
4. 然后对于解决方案 生成->批生成->全选->生成
把CxImage目录下的头文件考到某个head文件夹中
把CxImage/CxImageDLL这个目录下的lib文件考到某个lib文件夹中,4个模式,其中有分别对应CRT和MFC的,按照自己的需要来
在bin目录下有8个DLL文件,这个后面会用到
7. 新建一个项目,这里以CRT(win32 console application)项目为例
新建好之后,修改属性:
项目》属性》配置属性》常规 ,修改MFC的使用为 ”在共享Dll中“,修改字符集为多字节
项目》属性》配置属性》c/c++》常规》附加包含目录 添加上一步建立的head文件夹
项目》属性》配置属性》链接器》常规》附加库目录 添加上一步建立的lib文件夹
项目》属性》配置属性》链接器》输入》附加依赖项 添加cximagecrtd.lib(这一步按照不同的工程可能不同)
把上一步说到的bin目录下的8个DLL文件复制到源文件目录下(其实不必要8个,在不清楚的情况就8个一起复制过来)
8. 写个程序测试一下:
[cpp] view plaincopyprint?
// test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "ximage.h"
int _tmain(int argc, _TCHAR* argv[])
{
CxImage *p = new CxImage;
p->Load("d://1.jpg",CXIMAGE_FORMAT_JPG);
p->Save("1.png",CXIMAGE_FORMAT_PNG);
return 0;
}
运行成功的话说明配置OK
我补充一点,如果需要用到其他的类,比如CxImageTIF ,又必须需再声明对应的头文件,但是按照这个哥们的,那h头文件包里是没CxImageTIF 这个类的头文件的。所以干脆把CxImage开源的源码里所有的头文件都搜索出来再放到一个文件夹里,也包含到工程里,就是说包含2次头文件。一个是小范围的,一个是所有的。
CxImage cxMulti;
cxMulti.Load("c://multi.tif" , CXIMAGE_FORMAT_TIF);//加载一个多页tiff文件
int nPageCount = cxMulti.GetNumFrames();//得到tiff文件的页数
CxImage *pImageData = new CxImage[nPageCount+1];
for(int i=0;i<nPageCount;i++)
{
cxMulti.SetFrame(i);//设置当前帧为i编号图像
cxMulti.Load("c://multi.tif" , CXIMAGE_FORMAT_TIF);
pImageData[i].Copy(cxMulti);//将此页图像复制到pImageData[i]中
}
if(pImageData)
{
delete []pImageData;
pImageData = NULL;
}
如何创建一副多页TIFF
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);
或者
FILE * hFile;
hFile = fopen( " c://multi.tif " , "rb+ " );
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);
(我因为要在2008下开发,最好还是用2008来编译CxImage,网上很多教程都是很老的6.0下编译的,通用性不够会有很多问题,我之前折腾一天,不成功,也可能有这个方面的原因)
基本过程是:
1. 下载。。。 (最新的是cximage600_full)
2. 用vs2008打开源码工程。。
3. 一些必要设置,很重要:
有4个模式,其中切换到debug和unicode debug模式下,
修改如下设置:
对于目录下的13个项目,都要设置,分别是
属性->C/C++->常规->调试信息格式:修改为 程序数据库(/Zi)
属性->链接器->常规->启用增量连接:修改为 否(/INCREMENTAL:NO)
对于13个项目的debug和unicode模式都要修改
不修改的话中间可能会出现这种错误:LINK : fatal error LNK1000: Internal error during IncrBuildImage
补充:另外2个模式release和un release不用管,你懂得
4. 然后对于解决方案 生成->批生成->全选->生成
5. 等待一段很长时间等他生成完毕,13个项目,4个模式,总共52个
补充:我自己在编译的时候,有一个错误,说其中一个工程,cximageMfcDll编译错误。然后我单独编译它,又好了
6. 构造自己的CxImage库:把CxImage目录下的头文件考到某个head文件夹中
把CxImage/CxImageDLL这个目录下的lib文件考到某个lib文件夹中,4个模式,其中有分别对应CRT和MFC的,按照自己的需要来
在bin目录下有8个DLL文件,这个后面会用到
7. 新建一个项目,这里以CRT(win32 console application)项目为例
新建好之后,修改属性:
项目》属性》配置属性》常规 ,修改MFC的使用为 ”在共享Dll中“,修改字符集为多字节
项目》属性》配置属性》c/c++》常规》附加包含目录 添加上一步建立的head文件夹
项目》属性》配置属性》链接器》常规》附加库目录 添加上一步建立的lib文件夹
项目》属性》配置属性》链接器》输入》附加依赖项 添加cximagecrtd.lib(这一步按照不同的工程可能不同)
把上一步说到的bin目录下的8个DLL文件复制到源文件目录下(其实不必要8个,在不清楚的情况就8个一起复制过来)
8. 写个程序测试一下:
[cpp] view plaincopyprint?
// test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "ximage.h"
int _tmain(int argc, _TCHAR* argv[])
{
CxImage *p = new CxImage;
p->Load("d://1.jpg",CXIMAGE_FORMAT_JPG);
p->Save("1.png",CXIMAGE_FORMAT_PNG);
return 0;
}
运行成功的话说明配置OK
我补充一点,如果需要用到其他的类,比如CxImageTIF ,又必须需再声明对应的头文件,但是按照这个哥们的,那h头文件包里是没CxImageTIF 这个类的头文件的。所以干脆把CxImage开源的源码里所有的头文件都搜索出来再放到一个文件夹里,也包含到工程里,就是说包含2次头文件。一个是小范围的,一个是所有的。
另外我还遇到奇怪的问题,按照这哥们说的“修改字符集为多字节”,但是我编译没问题,启动的时候,2008提示找不到mfc42d.dll, 好像是这个名字吧。我去网上搜索,mfc要改成 静态的,我照做了,问题更多。link都出错。然后我又window标准库,编译,出错,再改回到动态库,竟然又好了。反正是莫名其妙的。反正好了,也没深究了
我再补充一点:以上都是debug工程,恩,你会觉得,恩,不错很爽。等你正式发布的时候,调整到release模式,又出来一堆问题。还是一样,字符集用多字符模式才可以
///
如何读取一个多页TIFFCxImage cxMulti;
cxMulti.Load("c://multi.tif" , CXIMAGE_FORMAT_TIF);//加载一个多页tiff文件
int nPageCount = cxMulti.GetNumFrames();//得到tiff文件的页数
CxImage *pImageData = new CxImage[nPageCount+1];
for(int i=0;i<nPageCount;i++)
{
cxMulti.SetFrame(i);//设置当前帧为i编号图像
cxMulti.Load("c://multi.tif" , CXIMAGE_FORMAT_TIF);
pImageData[i].Copy(cxMulti);//将此页图像复制到pImageData[i]中
}
if(pImageData)
{
delete []pImageData;
pImageData = NULL;
}
如何创建一副多页TIFF
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);
或者
FILE * hFile;
hFile = fopen( " c://multi.tif " , "rb+ " );
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);
以上代码,我自己在2008中测试了,有莫名其妙的错误,报告 unknown 什么什么错误。你们呢?希望有人留言,一起交流