无法使用Boost GIL检测图像文件类型(未捕获异常)

时间:2015-05-15 16:24:27

标签: c++ boost detection image-formats boost-gil

我需要测试文件是JPEG还是PNG,我不能信任文件扩展名,因为它可能是错误的。为此,我决定使用GIL。

Here's头文件声明(和定义)boost::gil::png_read_dimensions。它明确指出boost::gil::png_read_dimensions "如果该位置与有效的PNG文件" 不对应,则抛出std :: ios_base :: failure。事实上,这似乎与功能实际行为相同。

问题在于boost::gil::jpeg_read_dimensions,您可以看到here。它还明确指出,如果该位置与有效的JPEG文件" 不对应,它会引发std :: ios_base :: failure。但是,情况似乎并非如此!抛出没有异常,而是libjpeg打印到stdout或stderr,然后退出程序。

请参阅以下代码:

#include <iostream>
#include <string>

#include <boost/gil/extension/io/jpeg_io.hpp>
#include <boost/gil/extension/io/png_io.hpp>

using std::cout;
using std::cerr;
using std::endl;
using std::string;
using std::ios_base;

namespace bg = boost::gil;

int main(int, char**) {
  const string not_jpeg_or_png ("image.gif");

  cout << "bg::png_read_dimensions:" << endl;
  try {
    bg::png_read_dimensions(not_jpeg_or_png);
  } catch(const ios_base::failure &ib_f) {
    cerr << "what: " << ib_f.what() << endl;
  }

  cout << "\nbg::jpeg_read_dimensions:" << endl;
  try {
    bg::jpeg_read_dimensions(not_jpeg_or_png);
  } catch(const ios_base::failure &ib_f) {
    cerr << "what: " << ib_f.what() << endl;
  }

  cout << "\nDone." << endl;

  return 0;
}

节目输出:

bg::png_read_dimensions:
what: png_check_validity: invalid png file: unspecified iostream_category error

bg::jpeg_read_dimensions:
Not a JPEG file: starts with 0x62 0x6c

请注意what: ... yadiyadiyada ...Done.的打印方式。

我尝试过} catch(...) {代替} catch(const ios_base::failure &ib_f) {,以确保没有异常通过,但没有成功。没有异常被抛出!

我错过了一些非常明显的东西......?难道我做错了什么?有解决方法吗?

2 个答案:

答案 0 :(得分:1)

最简单的方法是读取文件的前几位,看看它们是否与文件类型的签名匹配。

89 50 4E 47 0D 0A 1A 0A =&gt; PNG

FF D8 FF =&gt; JPEG

答案 1 :(得分:0)

我不明白为什么抛出的异常显然无法捕获。这可能是一个错误。

然而,要完成我建议的任务

  • libmagic
  • identify(来自ImageMagick)

其他答案表明了这一点。

这个答案包含一个如何使用libmagic的例子(通常存在于linux上,但可以在任何其他平台上构建和(静态)链接: