【发布时间】:2015-05-16 02:53:09
【问题描述】:
我需要测试一个文件是 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) { 来确保没有异常通过但没有成功。不会抛出异常!
我是否在这里遗漏了一些非常明显的东西......?难道我做错了什么?有解决办法吗?
【问题讨论】:
标签: c++ boost detection image-formats boost-gil