【问题标题】:CImg with jpeglibCImg 与 jpeglib
【发布时间】:2017-11-19 02:10:28
【问题描述】:

我正在尝试使 CImg 与 Visual Sudio 2017 和 jpeg-9b 一起工作,但由于某种原因它不能。

代码:

#define cimg_use_jpeg
#include "../CImg/CImg.h"
using namespace cimg_library;

#pragma comment(lib, "libjpeg.a")

CImg<unsigned char> image("../images/img.jpg"), visu(500, 400, 1, 3, 0);

第一步是构建库,我在其中描述了如何使用 MinGW 编译器。即使构建成功,生成的库 libjpeg.a 在 Visual Studio 解决方案中不可链接。错误信息:

状态错误 LNK2019 未解析的外部符号 __imp___iob 在函数 _output_message 中引用

另一个生成的库 libjpeg.dll.a 在加载 .jpg 文件时抛出错误 CImg Exception (picture)

经过几次重建后,问题仍然存在。 我也尝试使用 VC 编译器,但我找不到调用构建 comand nmake -f makefile.vc setup-v10 时所需的 win32.mak 文件。此文件的非官方下载无法在我的电脑上正常运行。生成的解决方案无法在 Visual Studio 中打开。

是否有一些解决方法 - 如果没有解决方案?

【问题讨论】:

    标签: c++ linker-errors cimg


    【解决方案1】:

    如果您想使用 CImg 读取/写入 JPEG 图像,您有多种选择:

    选项 1

    您可以安装libjpeg,我已经详细介绍了here。如果您遵循此选项,则必须使用:

    #define cimg_use_jpeg
    

    CImg 将编译和链接 libjpeg 并读取和写入 JPEG 图像。您需要编译并安装 libjpeg 才能使用此选项。

    选项 2

    您可以安装 ImageMagick 并且 CImg 可以委托读取和写入它。如果您选择此路线,请务必在安装 ImageMagick 期间勾选标题为 “安装旧版命令” 或类似名称的框。此选项使您能够读取和写入除 JPEG 之外的大约 200 种其他图像格式。它对于生成测试图像和尝试算法也非常有用,而无需编写任何 C++ 代码。主要的缺点是它的分布相当大。

    如果你想使用这个选项,你不能#define cimg_use_jpeg 也不能#define cimg_use_magickCImg 将在运行时查找 ImageMagickconvert.exemagick.exe,而 ImageMagick 将不为人所知参与或参与您的 Visual Studio 项目。您可以致电:

    imagemagick_path()
    

    在运行时告诉 CImg 你在哪里安装了 ImageMagickconvert.exemagick.exe。如果使用此选项,则应在保存图像时使用通用的save() 方法,而不是save_jpeg()save_png()

    到目前为止,这是最简单的选择。

    选项 3

    如果你想使用这个选项,你必须这样做:

    #define cimg_use_magick
    

    然后 CImg 将编译并链接到 Magick++ - ImageMagick 的 C++ 接口。这需要您安装 Magick++ 的源代码,这可能是最难实现的选择。


    根据您的目标,您可以安装更简单、重量更轻的 NetPBM 工具并将图像转换为 PBM/PGM/PPM 格式,因为 CImg 可以原生读取和编写那些根本没有任何外部库的。

    可以想象,您可以在加载图像时使用 C++ 的system() 动态执行此操作。

    【讨论】:

    • 我尝试按照选项 1,但是我找不到 win32.mak 文件,所以这不起作用。 link 我通过下载此文件找到了解决方法,该文件生成了一个 .sln 文件,但它已损坏并且 Visual Studio 2017 无法打开它。使用ImageMagick-7.0.7-11-Q16-x64-dll.exe 编译器会抛出以下错误:Error C2039 'PaletteMatteType': is not a member of 'Magick' 等等
    • win32.mak 位于 Windows SDK 中,如果您选择了我在另一篇文章中用红色标记的所有内容,您应该拥有它。
    • 为什么编译器还要查看 ImageMagick?当您安装它时,它已经被编译和构建。如果您正在编译 ImageMagick,那么您在做一些根本错误的事情 - 这是没有必要的。
    • 其实不,我只是在定义#define cimg_use_magick,但编译器并不能识别很多元素。我还尝试了不同版本的 ImageMagick。如您在另一篇文章中所述,将所有包安装到 Visual Studio 不会将 win32.mak 添加到我的文件中。你知道其他解决方法吗?
    • 我通常使用 macOS 和 Linux,所以我不是最适合 Windows。但是,如果您在第 59,725 行附近查看 CImg.h,您会看到 CImg 只是试图找到到 C:\ImageMagick-??-\convert.exe 的路径,所以我一直认为编译器甚至不需要查看 ImageMagick,但程序在运行时找到 ImageMagick 的 convert.exe 并使用它...还有 imagemagick_path() 函数告诉 CImg ImageMagick 的安装位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多