CxImage开源库在VS2013的编译和使用

来源:互联网 发布:c语言程序员面试题 编辑:程序博客网 时间:2024/06/09 08:32

一、cximage600_full在VS2013编译和使用


1、编译
        (1)下载后解压缩,直接打开根目录下的 CxImgLib.dsw文件。版本转换完成之后,在编译之前先将每个工程属性的字符集由原先的使用Unicode字符集改为使用多字节字符集,生成解决方案。


注:编译报错及解决方法

1)字符问题解决方法:编译之前先将每个工程属性的字符集由原先的使用Unicode字符集改为使用多字节字符集。


2)编译报错:Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library。

     解决方法:下载 Multibyte MFC Library for Visual Studio 2013并安装  http://www.microsoft.com/zh-cn/download/details.aspx?id=40770


3)编译报错:错误 6 error LNK1104: 无法打开文件“.\Debug\png.lib”。
     解决方法:在编译cximagemfcdll之前,先修改其属性,链接器->输入->附加依赖项,将$(OutDir)png.lib等改为../../Debug/png.lib(../../Release/png.lib)。


4)编译报错:MFC does not support WINVER less than 0x0501.  Please change the definition of WINVER in your project properties or precompiled header.
     解决方法:cximage600_full\CxImage\CxImageDLL 和 cximage600_full\demo路径下的两个StdAfx.h 中的#define WINVER 0x0400改成#define WINVER 0x0501。


2、准备工作

        CxImage的使用方式是动态库的,所以需要三种东西 include、lib、dll。
        (1)include :cximage600_full\CxImage  路径下的头文件。
        (2)lib:cximage600_full\CxImage\CxImageDLL 路径下,根据编译时选择的“解决方案配置”(就是debug、release之类)。会有对应的文件夹。我选择的是debug。所以会有一个debug文件夹,里面就有需要的lib文件。
        (3)dll:cximage600_full\bin 路径下会有生成的dll。有两个dll。一个文件名里有 crt,另一个没有,不带crt的动态库就是给mfc用的。


3、测试

        (1) 创建一个win32控制台应用程序做测试,创建项目后,先修改项目字符集,配置include和lib。


        (2) 把1.jpg图片和cximage600_full\bin 目录下的dll文件放到测试的exe文件路径内。
        (3) 编译执行后,就将1.jpg另存为2.png了。

#include "stdafx.h"#include<iostream>#include"ximage.h"#pragma comment(lib,"cximagecrtd.lib")int main(){    CxImage image;    image.Load("1.jpg");    image.Save("2.png", CXIMAGE_FORMAT_PNG);    return 0;}


注:编译报错及解决方法

         (1) 编译报错:error C2664: “bool CxImage::Load(const TCHAR *,DWORD)”: 无法将参数 1 从“const char [6]”转换为“const TCHAR *”。
             解决方法:将字符集由使用Unicode字符集改为使用多字节字符集。

         (2) 编译报错: error C4996: '_wfopen': This function or variable may be unsafe. Consider using _wfopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
              解决方法:在项目属性C/C++->预处理器->预处理器定义中添加_CRT_SECURE_NO_WARNINGS



二、cximage702_full在VS2013编译和使用


1、编译

        (1)从http://sourceforge.net/projects/cximage/下载最新的CxImage 702源码;解压缩后,用vs2013打开CxImageFull_vc10.sln工程。
        (2) 在编译之前先将每个工程属性的字符集由原先的使用Unicode字符集改为使用多字节字符集。
        (3) 首先编译jasper、jbig、jpeg、libdcr、libpsd、mng、png、tiff、zlib这9个库,然后编译cximage,cximagecrtdll。
        (4)再接着编译cximagemfcdll,在编译cximagemfcdll之前,在编译cximagemfcdll之前,先修改其属性,链接器->输入->附加依赖项,将$(OutDir)png.lib等改为../../Debug/png.lib。
        (5) 最后编译demo、demodll;全部编译完后即可生成相应的静态库和动态库。


2、具体说明

       直接打开CxImageFull_vc10.sln,打开后发现共有该解决方案下共有14个项目,
       (1)cximage、jasper、jbig、jpeg、libdcr、libpsd、mng、png、tiff、zlib这10个项目是生成静态库文件的,对应的静态库文件分别是cximage.lib,jasper.lib,jbig.lib,jpeg.lib,libdcr.lib, libpsd.lib,mng.lib,png.lib,tiff.lib,zlib.lib;
       (2)CxImageCrtDll和cximagemfcdll这两个项目是生成动态库的;
       (3)另外有demo和demodll这两个项目是演示用的,生成demo.exe和demodll.exe两个应用程序(在D:\\cximage702_full\bin目录下),两者之间的差别可能是一个使用的是静态库(demo),一个使用的是动态库(demodll)。

       (4)整个解决方案项目之间的依赖关系是:

  • 10个静态库文件不依赖任何其他项目;
  • CxImageCrtDll和cximagemfcdll这两个项目依赖于除cximage外的其它静态库项目;
  • demo依赖于10个静态库项目;
  • demodll不依赖任何项目,但在链接器->输入->附加依赖项的时候发现,该项目依赖于10个静态库项目生成的对应lib文件,这些文件必须在此之前生成
         (5)静态库文件的生成:
          根据依赖关系,在CxImageCrtDll,cximagemfcdll,demo任意一个项目上上右键生成,都会在相应的D:\\cximage702_full\Debug目录或者D:\\cximage702_full\Release\目录下得到静态库文件
         (6)动态库文件的生成

         生成文件在解决方案所在目录的bin目录下,Debug模式下:cximagecrtd.dll和cximaged.dll,同时注意Debug目录下分别有cximagecrtd.lib和cximaged.lib生成,这两个库文件在动态调用dll的时候有用。


3、准备工作

        (1)建立D:\cximage702\cximage_build\Multi-byte文件夹,将编译好的CxImage文件夹下的所有头文件拷贝到include文件夹下。
        (2)静态库的准备: 将debug模式下生成的静态库文件Debug目录下。
        (3)动态库的准备:将bin目录下的cximaged.dll和cximagecrtd.dll提取出来备用。


4、测试

       (1) 创建一个win32控制台应用程序做测试,创建项目后,先修改项目字符集,配置include和lib, 在项目属性C/C++->预处理器->预处理器定义中添加_CRT_SECURE_NO_WARNINGS。
       (2) 把1.jpg图片和cximaged.dll和cximagecrtd.dll文件放到测试的exe文件路径内。
       (3)测试程序,编译成功。

//stdafx.h#pragma once#include "targetver.h"#include <stdio.h>#include <tchar.h>// TODO:  在此处引用程序需要的其他头文件#include "./cximage_build/include/ximage.h" #pragma comment(lib, "wininet.lib")  #pragma comment(lib, "./cximage_build/Debug/cximage.lib")  //#pragma comment(lib, "./cximage_build/Debug/jasper.lib")  //#pragma comment(lib, "./cximage_build/Debug/jbig.lib")  //#pragma comment(lib, "./cximage_build/Debug/jpeg.lib")  //#pragma comment(lib, "./cximage_build/Debug/libdcr.lib")  //#pragma comment(lib, "./cximage_build/Debug/libpsd.lib")  //#pragma comment(lib, "./cximage_build/Debug/mng.lib")  //#pragma comment(lib, "./cximage_build/Debug/png.lib")  //#pragma comment(lib, "./cximage_build/Debug/tiff.lib")  //#pragma comment(lib, "./cximage_build/Debug/zlib.lib")  
//cximage_test.cpp#include "stdafx.h"#include <stdio.h>  #include <iostream>  #include <string>  using namespace std;#ifdef _DEBUG#define _CRTDBG_MAP_ALLOC#include <stdlib.h>#include <crtdbg.h>#endifint _tmain(int argc, _TCHAR* argv[]){CxImage image;string imageName = "./1.jpg";string imageSave = "./2.tif";image.Load((const TCHAR*)imageName.c_str(), CXIMAGE_FORMAT_JPG);cout << image.GetBpp() << endl;if (image.IsValid()) {image.GrayScale();image.Save((const TCHAR*)imageSave.c_str(), CXIMAGE_FORMAT_TIF);cout << "success" << endl;}cout << "ok" << endl;return 0;}


原创粉丝点击