无法使用 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
我需要测试文件是 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