【问题标题】:Cannot load any image with CImg无法使用 CImg 加载任何图像
【发布时间】:2017-09-05 13:04:32
【问题描述】:

每当我尝试加载图像时,都会收到错误消息CImg<unsigned char>::load(): Failed to recognize format of file。 jpg 和 png 文件都会发生这种情况。

我找到了关于定义cimg_use_pngcimg_use_jpeg 的其他帖子,但后来我收到编译错误,告诉我我需要png.njpeglib.h。不知道我应该从哪里得到这些。

我不确定我哪里出错了,所以我不知道具体要问什么。出了什么问题?

【问题讨论】:

  • 我没有让它工作。我找到了 libjpeg 的预编译版本,但是一旦我设置它,原始错误(无法识别文件格式)又回来了。我最后切换到了stb_image。
  • 很抱歉听到这个消息。您使用的是什么版本的 Windows?您使用的是 Visual Studio - 如果是,是哪个版本?
  • Windows 10 和 VS2017 社区。我也使用默认的空 C++ 解决方案。

标签: c++ libjpeg cimg


【解决方案1】:

如果你想打开JPEG图片,你需要安装libjpeg并编译链接。

如果你想打开PNG图像,你需要安装libpnglibz(用于压缩)并编译和链接它们。

目前,您应该可以使用 NetPBM 格式的图像 - 即 PBM、PGM 和 PPM。


好吧,经过两天痛苦的尝试了解 Visual Studio 2017 的工作原理,以及如何安装和集成 libjpeg 与它,我现在可以解释如何安装 CImg 和 Windows 上的 libjpeg。

第 1 步

您需要安装 Visual Studio 2017,这意味着您需要 Windows 7 SP1 或更高版本。安装的时候一定要包含“Windows 8.1 SDK”

第 2 步

IJG website 下载libjpeg。我拿了jpegsr9b.zip,因为它是最新的。

第 3 步

解压缩文件并将其存储在您的 HOME 目录中名为 libjpeg 的目录中。

第 4 步

转到开始>所有程序>Microsoft Visual Studio 2017>Visual Studio 工具>VS2017 的开发人员命令提示符

导航到您刚刚解压缩的目录。那将是这样的:

cd libjpeg
cd jpeg-9b

第 5 步

现在您需要找到一个名为win32.mak 的文件。我在C:\Program Files\Microsoft SDKs\Windows\v7.0\Include 找到了我的。如果您有 Windows 8.1 SDK,您的可能在其他地方。无论如何,无论它在哪里,您都需要将其包含目录添加到您的包含中。所以我做了:

set INCLUDE=%INCLUDE%;C:\Program Files\Microsoft SDKs\Windows\v7.0\Include

第 6 步

现在运行 nmake 来获取您的 SLN - 一些奇怪的 Microsoft “解决方案” 文件。命令是:

nmake -f makefile.vc setup-v10

你应该得到一个名为jpeg.sln的文件 - 万岁!

第 7 步

现在启动 Visual Studio 2017,打开您刚刚创建的 jpeg.sln 文件并构建项目。它将在您的libjpeg 目录中创建一个Release 目录,在Release 目录中您将找到jpeg.lib。你现在已经安装了libjpeg

第 8 步

关闭该项目,并启动一个新的 C++ 命令行项目并编写基于 CImg 的程序。我写过最简单的:

#define cimg_use_jpeg
#include "CImg.h"
using namespace cimg_library;
int main() {
    CImg<unsigned char> img("C:\\Users\\Mark\\test.jpg");
    img.display("Image");
    return 0;
}

第 9 步

Github 下载CImg.h,并将其保存在您的HOME 目录中名为CImg 的目录中。

第 10 步

现在告诉 Visual Studio 包含文件(CImglibjpeg)在哪里以及库文件(libjpeg)在哪里:

第 11 步

现在告诉 Visual Studio 2017 你想与libjpeg 链接:

第 12 步

现在您可以编译、链接和运行您的 CImg 程序并加载 JPEG 文件并将它们显示在屏幕上!


如果您在 Linux/ma​​cOS 上使用 cmakethis answer 会为您指明方向。


如果您在 ma​​cOS 上从命令行编译,如果要在屏幕上显示图像,则需要安装 XQuartz,并且您需要像这样:

g++ -std=c++11  sample.cpp -o sample -I /opt/X11/include -L /opt/X11/lib -lX11 -ljpeg -lpng -lz

【讨论】:

  • 我已经更新了我的答案,详细介绍了如何在 Windows 中安装和链接 libjpeg
  • 我在第 5 步卡住了 - 即使我安装了 Windows 8.1 SDK 也找不到 win32.mak
  • @Draex_ 我在 Windows 上也找不到任何东西!启动命令提示符,然后使用“cd \”将目录更改为 C: 驱动器的顶部。那就试试DIR /B /S | FINDSTR /I win32.mak
  • 那个命令没有找到任何东西,但我使用了来自这个 repo 的 dll:github.com/amirhessam/libjpeg-windows 并且它工作了 :-)
【解决方案2】:

如果您希望 CImg 处理 jpeg 或 png 图像,您需要提供适当的库。

这是一个如何将 libjpeg 安装到 Visual Studio 项目的教程。这基本上是对 Mark Setchell 答案的 2019 年更新。

如何将 libjpeg 安装到您的项目中

  1. 下载带有源代码的jpegsr9c.zip(或更新版本)zip

  2. 将存档解压缩到一个文件夹中。

  3. 复制从存档中提取的文件夹的地址

  4. 在开始菜单中搜索开发者命令提示符

  5. 在开发者命令提示符中导航到解压文件夹:

    cd "C:\Users\HP\Downloads\temp\jpeg-9c"

使用右键粘贴。

  1. 运行这个命令:

    NMAKE /f makefile.vs setup-v15

  1. 打开jpeg.sln(现已创建)。

  1. 在解决方案资源管理器中,右键单击项目。选择重新定位项目。确认提示。

  1. 如果您想为 64 位平台构建项目:右键单击解决方案,选择配置管理器并添加新平台 x64

  2. 构建解决方案

  1. 现在让我们使用 CImg 转到您的项目。在您的项目中创建一个文件夹 jpeglib(对我来说是 IncludedLibraries\jpeglib)。并将其添加到 Project Properties -&gt; C/C++ -&gt; Additional Include DirectoriesProject Properties -&gt; Linker -&gt; Additional Library Directories

  2. jpeg.lib 添加到Project Properties -&gt; Linker -&gt; Input -&gt; Additional Dependencies

  1. 复制x64/Release/jpeg.lib到这个文件夹。

  2. 在jpeg项目中搜索所有头文件(`.h),并复制到该文件夹​​中。

  1. 在您的项目中在#include "CImg.h" 之前添加#define cimg_use_jpeg

  1. 全部完成! CImg 现在可以读取和保存 jpeg 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    相关资源
    最近更新 更多