我需要测试文件是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) {
,以确保没有异常通过,但没有成功。没有异常被抛出!
我错过了一些非常明显的东西......?难道我做错了什么?有解决方法吗?
答案 0 :(得分:1)
最简单的方法是读取文件的前几位,看看它们是否与文件类型的签名匹配。
89 50 4E 47 0D 0A 1A 0A =&gt; PNG
FF D8 FF =&gt; JPEG
答案 1 :(得分:0)
我不明白为什么抛出的异常显然无法捕获。这可能是一个错误。
然而,要完成我建议的任务
libmagic
或identify
(来自ImageMagick)其他答案表明了这一点。
这个答案包含一个如何使用libmagic的例子(通常存在于linux上,但可以在任何其他平台上构建和(静态)链接: