ファイルが JPEG か PNG かをテストする必要がありますが、ファイル拡張子が間違っている可能性があるため、信頼できません。これを実現するために、GIL を使用することにしました。
宣言 (および定義) するヘッダー ファイルを次に示しboost::gil::png_read_dimensions
ます。boost::gil::png_read_dimensions
「場所が有効なPNGファイルに対応していない場合、std::ios_base::failureをスローします」と明確に述べています。実際、これは関数の実際の動作と同等のようです。
問題は、ここでboost::gil::jpeg_read_dimensions
見ることができるものです。また、 「場所が有効な JPEG ファイルに対応していない場合、std::ios_base::failure をスローする」ことも明確に述べています。しかし、そうではないようです!例外はスローされず、代わりに stdout または stderr に出力され、プログラムが終了します。libjpeg
次のコードを参照してください。
#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) {
例外はスローされません。
ここで本当に明らかな何かが欠けていますか...?私は何か間違ったことをしていますか?回避策はありますか?