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

时间:2024-03-26 10:59:17

一、cximage600_full在VS2013编译和使用


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

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


注:编译报错及解决方法

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。

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

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

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


注:编译报错及解决方法

         (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

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


二、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)测试程序,编译成功。

  1. //stdafx.h
  2. #pragma once
  3. #include "targetver.h"
  4. #include <stdio.h>
  5. #include <tchar.h>
  6. // TODO: 在此处引用程序需要的其他头文件
  7. #include "./cximage_build/include/ximage.h"
  8. #pragma comment(lib, "wininet.lib")
  9. #pragma comment(lib, "./cximage_build/Debug/cximage.lib")
  10. //#pragma comment(lib, "./cximage_build/Debug/jasper.lib")
  11. //#pragma comment(lib, "./cximage_build/Debug/jbig.lib")
  12. //#pragma comment(lib, "./cximage_build/Debug/jpeg.lib")
  13. //#pragma comment(lib, "./cximage_build/Debug/libdcr.lib")
  14. //#pragma comment(lib, "./cximage_build/Debug/libpsd.lib")
  15. //#pragma comment(lib, "./cximage_build/Debug/mng.lib")
  16. //#pragma comment(lib, "./cximage_build/Debug/png.lib")
  17. //#pragma comment(lib, "./cximage_build/Debug/tiff.lib")
  18. //#pragma comment(lib, "./cximage_build/Debug/zlib.lib")
  1. //cximage_test.cpp
  2. #include "stdafx.h"
  3. #include <stdio.h>
  4. #include <iostream>
  5. #include <string>
  6. using namespace std;
  7. #ifdef _DEBUG
  8. #define _CRTDBG_MAP_ALLOC
  9. #include <stdlib.h>
  10. #include <crtdbg.h>
  11. #endif
  12. int _tmain(int argc, _TCHAR* argv[])
  13. {
  14. CxImage image;
  15. string imageName = "./1.jpg";
  16. string imageSave = "./2.tif";
  17. image.Load((const TCHAR*)imageName.c_str(), CXIMAGE_FORMAT_JPG);
  18. cout << image.GetBpp() << endl;
  19. if (image.IsValid()) {
  20. image.GrayScale();
  21. image.Save((const TCHAR*)imageSave.c_str(), CXIMAGE_FORMAT_TIF);
  22. cout << "success" << endl;
  23. }
  24. cout << "ok" << endl;
  25. return 0;
  26. }