VS2015+MFC+CxImage702+Opencv环境的配置

清疚 2022-05-29 02:18 396阅读 0赞

为了能在MFC下实现插入和显示图片(不仅仅是位图格式),并应用其他图像处理的算法对图像进行操作,典型的UI+后台的模式。由于仅依靠MFC的基础控件,是无法方便的完成对图像的操作的,尤其是利用图像控件去显示一个图像时,必须要给定固定路径和保证其为位图格式,不可用之。经多方查找之后,找到了CxImage这一利器。

CxImage简介:(作者:Davide Pizzolato)

CxImage类库是一个优秀且开源的图像操作类库。它可以快捷地存取、显示、转换各种图像。CxImage是一个可以简便而快速地打开、保存、显示和转换图像文件的 C++类库,它可以用于MFC,可以打开,保存,显示,转换各种常见格式的图像文件,比如BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K 等格式的文件。可以实现BMP<->JPG,PNG <->TIFF格式等等的互相转换。CxImage不仅可以实现图像文件的类型转换,还可以实现在内存图像数据的类型转换,并且使用很方便。除了文件格式的相互转换,它还提供了很多很多图像后处理的功能,比如图像模糊,锐化等等,功能非常强大和实用。另外,CxImage是开源的,并在zlib许可下发布,“如果你在你的产品中使用了这些源代码,虽然致谢不是必须的,但是却会得到众人的欣赏。”简单地说,你可以随意地使用这些代码,只要你不说它是你自己的就行了。

CxImage中的x,大约代表了丰富的图像格式支持和丰富的图像处理功能,可以说CxImage是图像处理的十全大补汤。(转)

CxImage 702 在VS2015中的配置:

step1:在此

https://sourceforge.net/projects/cximage/链接中下载最新版本的CxImage 702源码;

自己编译过程比较痛苦,若想掠过此步骤,可到

https://download.csdn.net/download/pnan222/10287562进行下载,直接进行Step3;

step2:编译CxImage702(已下载过的跳过此步即可);

(1)解压源文件,并用VS2015打开CxImageFull_vc10.sln工程,一共包含有14个库,要用Debug和Release分别编译,即共需要编译28次;

Debug模式下:

(2)确保每个库名(14个)右键—》属性—》字符集(Character Set)为Use Unicode Character Set;(建议先不要听信大佬的“谗言”)

(3)开始编译,注意编译顺序;

首先编译:jasper、jbig、jpeg、libdcr、libpsd、mng、png、tiff、zlib这9个库;

然后编译cximage,cximagecrtdll;在编译cximage时可能会报错,参见“问题和解答(2)”。

然后编译cximagemfcdll,一般会提示LNK1104: 无法打开文件”*.lib”的错误,参见“问题和解答(3)”。

最后编译demo、demodll;全部编译完后即可生成相应的静态库和动态库;

Release模式下:重复(2)(3)。

特别注意:整个编译过程中,编译模式和配置模式一定要保持一致;即若采用Debug模式编译,对应库的属性页的配置也应该调成Debug模式;Release模式同理。

目前CxImage支持的图像格式包括:bmp、gif、jpg、png、ico、tif、tga、pcx、wbmp、wmf、jp2、jpc、pgx、pnm、ras、jbg、mng、ska、raw和psd;

几点说明和解释:

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\目录下得到静态库文件

step3:利用编译好的CxImage702完成配置;(静态配置)

(1)建立树形文件结构:

***目录下新建文件夹Cximage

|——-include

|——-lib

|——-debuglib

|——-releaselib

(2)准备文件

  • 将cximage702_full\CxImage文件夹下的所有头文件和源文件拷贝到***/cximage/include文件夹下
  • 将debug模式下生成的静态库文件D:\\cximage702_full\Debug拷贝到***\cximage\lib\debug目录下
  • 将release模式下生成的静态库文件D:\\cximage702_full\Release拷贝到***\cximage\lib\release目录下

(3)静态配置,往已经建立好的MFC项目中进行以下配置:

  • 项目—>属性—>配置属性—>常规里按如下配置

    • 选择“在共享DLL中使用MFC”,如果想要静态链接到MFC(和CRT),则要修改Cximage的10个库的配置,让它们也静态连接到CRT。否则会报XXX重定义的错误。
    • 使用“Unicode字符集”, 因为Cximage的10个库的项目配置里面全部都用的是Unicode字符集。 这里字符集如果选错的话,链接Cximage的时候会失败,提示找不到Cximage中的链接符号。也就是说字符集设置一定要与Cximage一致。
    • 同理,如果想把项目编译成64位的,那么也需要将Cximage重新编译成64位的。
  • VC++目录

    • 包含目录设置:***\cximage\include\ 即把头文件包含进去
    • 库目录设置:***\cximage\lib\debug或者release(具体设置)
  • 链接器->输入->附加依赖项

    • 以分号或者回车为间隔,填入lib文件夹中的库文件,即生成的十个静态库文件
    • cximage.lib,jasper.lib,jbig.lib,jpeg.lib,libdcr.lib,libpsd.lib,mng.lib,png.lib,tiff.lib,zlib.lib
  • C/C++代码生成

    • 结构成员对齐:16字节
    • 预编译头:不使用

Step4:程序测试:

测试代码:

  1. void CToolsV1Dlg::OnBnClickedOpenimageb()
  2. {
  3. // TODO: 在此添加控件通知处理程序代码
  4. UpdateData(TRUE);
  5. CxImage image;
  6. image.Load(_T("pic/pic.jpg"), CXIMAGE_SUPPORT_JPG);
  7. if (image.IsValid())
  8. {
  9. //image.GrayScale();
  10. CDC *pDC = GetDC();
  11. image.Draw(pDC->GetSafeHdc(), CRect(0, 0, 200, 200));
  12. pDC->DeleteDC();
  13. image.Save(_T("pic/test.jpg"), CXIMAGE_SUPPORT_JPG);
  14. }
  15. UpdateData(FALSE);
  16. }

运行中可能出现的错误,参见“问题和解答(4)(5)”

配置过程中出现的问题和解答:

(1)弱智错误:vs:严重性代码说明项目文件行错误LNK1168无法打开***.exe进行写入;

解决方法:把已经运行出的界面窗口关闭,或者是改程序的debug进程kill掉,再进行编译运行即可。

(2)error C2371 int_fast16_t 重定义不同的基类型;uint_fast16_t 重定义不同的基类型;且报错的行数和实际错误行数不一致,要仔细找到实际错误的地方。

解决方法1’:在cximge库的stdin.h文件中修改:

  1. #if _MSC_VER < 1600
  2. typedef uint16_t uint_fast16_t//出错部分
  3. #endif

解决方法2’:在cximge库的stdin.h文件中修改:

把 typedef uint16_t uint_fast16_t 改为 :

  1. #ifdef uint_fast16_t
  2. typedef uint16_t uint_fast16_t
  3. #endif

(3)错误:LNK1104: 无法打开文件”*.lib”的提示。在编译cximagemfcdll之前,先修改其属性,linker->input->Additional Dependencies,将 $(OutDir) png.lib等改为../../Debug/png.lib(../../Release/png.lib) ;右键cximagemfcdll—>属性—>配置属性—>常规—>输出目录,把“.\debug\”(“.\release\”)删去,什么都不填,或者填上$(SolutionDir)$(Configuration)\这句,只要保证附加依赖项(Additional Dependencies)中计算出的目录为 ***\cximage702_full\Debug\***.lib或者***\cximage702_full\Release\***.lib就可以了。

(4)错误:错误C2039 “int_fast16_t”: 不是“`global namespace’”的成员严重性 错误 C287….;

再次关于int_fast16_t和uint_fast16_t进行报错:由于cximage中的stdin.h头文件被包含在include的文件夹中,并被引用了,所以此时应该按照错误(2)的改动方式将该文件复原,注意复原的是copy后的文件,并不是编译时用的文件。

(5)错误:错误LNK2001 无法解析的外部符号: “public: bool __thiscall CxImage::Load(wchar_…;

此为关于Load和Save函数的错误,表示配置中还是出现了问题,很可能是lib路径没有找对,建议仔细排查错误,并重新配置。

功夫不负有心人,祝配置成功!如有不足,敬请留言!

发表评论

表情:
评论列表 (有 0 条评论,396人围观)

还没有评论,来说两句吧...

相关阅读

    相关 VS2015OpenCV配置

    OpenCV是开源计算机视觉库,它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。opencv 拥有包括 300 多个 C 函数的跨平台

    相关 VS2015+MFC+CxImage702+Opencv环境配置

    为了能在MFC下实现插入和显示图片(不仅仅是位图格式),并应用其他图像处理的算法对图像进行操作,典型的UI+后台的模式。由于仅依靠MFC的基础控件,是无法方便的完成对图像的操