【问题标题】:CImg error : Failed to recognize format of file "xxx.png"CImg 错误:无法识别文件“xxx.png”的格式
【发布时间】:2018-02-16 16:39:55
【问题描述】:

我一直在寻找 C++ 中的代码,它可以获取 png 文件的所有像​​素的 RGB 值。

所以我通过互联网搜索了很多,发现了不同的方法来做这样的事情,比如使用 libpng 、 OpenCV 、 Magick++ 、 CImg 等,我只是决定使用 CImg (主要是因为我不知道如何使用 OpenCV,尽管我在 Code::Blocks 中搜索了很多关于如何安装和使用它的信息,它与我从 Sorceforge 下载的安装程序 mingw64 有关,在下载一些文件的过程中不断给我错误,而关于其余部分,我只是找不到与 Code::Blocks 兼容的适当头文件(如 Magick++.h)......所以如果你认为其中一些会比 CImg.h 更好更简单,如果您提供标题的下载链接或任何其他必要的东西,我将不胜感激)

这是我在 Cimg 中找到的代码:

#include <windows.h>
#include <iostream>
using namespace std;

#include <CImg.h>
using namespace cimg_library;

int main()
{
CImg<unsigned char>src("twittericon.png");
int width = src.width();
int height = src.height();
cout << width << "x" << height << endl;
for (int r = 0; r < height; r++)
for (int c = 0; c < width; c++)
   cout << "(" << r << "," << c << ") ="
        << " R" << (int)src(c,r,0,0)
        << " G" << (int)src(c,r,0,1)
        << " B" << (int)src(c,r,0,2) << endl;
return 0;
}

但问题是在运行程序后,它给了我错误: CImg::load(): 无法识别文件“twittericon.png”的格式

我应该怎么处理这个错误?

顺便问一下,你知道有什么更好的方法来读取 png 文件的这些 RGB 值吗?如果你这样做,你能不能也给我一点指导?谢谢。

【问题讨论】:

  • Google 搜索:“MSDN SetDIBitsToDevice”,单击第一个链接,转到页面底部的表格并将库包含在链接器设置中。 MSDN 站点上列出了所有 Win32API 函数以及所需的标头和库。
  • 我添加了这一行:#include 我下载了 Gdi32.lib 并将其添加到我的编译器设置中的链接器设置中。现在运行程序没有错误,但之后,它给出了这个错误: CImg::load(): Failed to identify format of file 'twittericon.png' 现在我该怎么办?它不适用于png文件吗?
  • 您必须安装libpng 才能读取/写入PNG 文件。不过,我怀疑您最好安装 ImageMagick,因为 CImg 可以使用它为您读取大多数文件格式。请记住在安装 ImageMagick 时勾选选项“安装旧版工具”
  • 你能帮我下载哪一个吗?如果您需要,我正在使用 Windows 10、C++ 和 Code::Blocks。 imagemagick.org/script/install-source.php
  • 你不需要安装源。您可以使用现成的二进制文件,这更容易。

标签: c++ cimg


【解决方案1】:

有很多方法可以获取PNG 文件中的RGB 像素值,最好的方法取决于您的实际使用场景。


选项 1

如果您有一两个 PNG 文件,并且您只想一次轻松地获得 RGB 像素,那么我建议您安装任何已构建好的 ImageMagick 二进制文件给定的链接。然后我们可以在终端或命令提示符的命令行中创建一个像这样的测试PNG文件:

convert xc:red xc:lime xc:blue +append \( xc:cyan xc:magenta xc:yellow +append \) -append image.png

它看起来像这样(只是更小):

(我认为你在上面的命令中省略了Windows下的反斜杠)

好的,现在您想查看 RGB 值,因此您可以将文件转储为文本:

convert image.png -depth 8 txt:

样本输出

# ImageMagick pixel enumeration: 3,2,65535,srgb
0,0: (65535,0,0)  #FF0000  red
1,0: (0,65535,0)  #00FF00  lime
2,0: (0,0,65535)  #0000FF  blue
0,1: (0,65535,65535)  #00FFFF  cyan
1,1: (65535,0,65535)  #FF00FF  magenta
2,1: (65535,65535,0)  #FFFF00  yellow

或者,您可以在 ASCII 模式下将文件转换为古老(但极好)的 NetPBM 格式Wikipedia description of NetPBM

convert image.png -compress none image.pnm

现在你得到一个可以轻松阅读的文件:

P3                              # PPM in ASCII mode
3 2                             # width=3 height=2
255                             # 8-bit
255 0 0 0 255 0 0 0 255 
0 255 255 255 0 255 255 255 0 

如果您省略-compress none,您将获得相同的文件,但 RGB 数据将是 8 位无符号二进制,然后整个文件在 C/C++ 中非常容易读取。事实上,CImg 知道如何读/写这些。

因此,您可以提前将要访问的任何图像(TIF、BMP、JPEG、GIF)转换为 NetBM PPM 文件,然后使用 CImg。大功告成!


选项 2

在下一个级别,您可以从 ImageMagick 网站上的预构建二进制文件安装 ImageMagick,然后使用 CImg。然后,CImg 将定位 ImageMagickconvert/magick 程序,使用它来转换它自己无法读取的任何内容。这样您就可以立即免费访问 ImageMagick 知道的大约 200 多种格式。


选项 3

或者,您可以构建和安装libpng,然后在使用CImg 编写代码时定义一个宏before,包括CImg.h,它使用libpng读取和写入 PNG 文件。

当您可以让 ImageMagick 完成所有工作时会遇到很多麻烦,最后您只能获得 PNG 支持而不是 200 多种格式那个工作。

这个场景看起来像这样:

#define cimg_use_png 1
#include "CImg.h"
...
...

你会编译:

c++ -I CIMG_DIRECTORY -L LIBPNG_DIRECTORY -lpng -lz

我做了另一个答案,对libjpeg 使用此选项并让 CIMg 读取和写入 JPEG。我只能说这很痛苦——答案是here

【讨论】:

  • 再次抱歉问了很多问题,正如我已经说过的,我只是一个初学者(尽管如此感谢您的指导:))所以这是第一个问题,这条线到底是什么选项 1 部分关于? :convert xc:red xc:lime xc:blue +append \( xc:cyan xc:magenta xc:yellow +append \) -append image.png 和第二个问题与第一个问题相同,但关于这一行:convert image.png -compress none image.pnm 看起来,这些不是命令,那么它们是什么?最好说,代码应该是什么样子(可能看起来太愚蠢了,但我就是不明白:()
  • 除了安装 ImageMagick 并将 Include 文件夹内容从其安装目录复制到 Code::Blocks 安装目录中的 Include 文件夹,然后添加行 @987654346 之外,我还需要做些什么吗? @到我的代码的开头?因为这就是我所做的一切(我知道我应该做的一切)关于选项 2 部分,其中 CImg 使用 ImageMagick 进行转换,convert/magick 是什么意思?它会成为我一开始提到的代码的一部分吗? (如果我让你头疼,我真的很抱歉!:()
  • 没问题,我们都在学习。 Q1) 您只需在终端、命令提示符、DOS 框或任何 Windows 调用的命令中输入命令,例如DIR
  • Q3) 不,不要#include Magick++.h 这是实验性的和不必要的。
  • Q4) 在 ImageMagick 版本 7 中,您在命令提示符中键入以运行它的命令从 convert (v6) 更改为 magick (v7)。如果在安装 v7 时选中标记为 Install legacy tools 的框,您将能够在命令行中使用 magickconvert。如果您不选中该框,您将只能使用magick
猜你喜欢
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 2016-02-14
  • 2016-05-25
  • 1970-01-01
相关资源
最近更新 更多