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

Cannot use Boost GIL to detect image filetype (exception not caught)

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

Here's 声明(和定义)boost::gil::png_read_dimensions 的头文件。明明是boost::gil::png_read_dimensions"Throws std::ios_base::failure if the location does not correspond to a valid PNG file"。事实上,这似乎与函数的实际行为不相上下。

问题出在 boost::gil::jpeg_read_dimensions 上,您可以看到 here。它还清楚地表明它"Throws std::ios_base::failure if the location does not correspond to a valid JPEG file"。然而,事实似乎并非如此!没有抛出异常,而是 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) { 来确保没有异常被忽视但没有成功。没有异常被抛出!

我是不是漏掉了一些很明显的东西...?难道我做错了什么?有解决方法吗?

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

但是,要完成我建议的任务

  • libmagic
  • identify(来自 ImageMagick)

哪个按照其他答案的建议执行。

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

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

89 50 4E 47 0D 0A 1A 0A => PNG

FF D8 FF => JPEG