2

Cimg グラフィック ライブラリを使用して小さな C プログラムを作成しており、ファイルが画像であることをテストする必要があります。

ファイル/画像をロードしようとしました

CImg<unsigned char> srcimg(filename)

免除をキャッチしますが、cimgは次のようにきっぱりと終了します。

convert.im6: improper image header `pok.txt' @ error/bmp.c/ReadBMPImage/603.
convert.im6: no images defined `pnm:-' @ error/convert.c/ConvertImageCommand/3044.
sh: 1: gm: not found
terminate called after throwing an instance of 'cimg_library::CImgIOException'
  what():  [instance(0,0,0,0,(nil),non-shared)] CImg<unsigned char>::load() : Failed to recognize format of file 'pok.txt'.
Aborted

もちろん、ファイルはtxtですが、サフィックスを無視して、これをテストする適切な方法はありますか? 別の依存関係/ライブラリを含まずに。

ありがとう

4

4 に答える 4

0

徹底的なテストが必要ですか、それとも多数の候補者の違いだけが必要ですか?

適切なファイル タイプをすばやく見つけるには、ファイルから最初のバイトを読み取るだけです。それで、

  • これらが'BM'Windows BMP である場合
  • これらが0x89 'PNG'PNGの場合
  • TIFF ファイル'II'を示します。'MM'
  • シーケンス0xFF 0xD8 0xFF 0xE0は JPEG ファイルの典型的な始まりです (他にもいくつかあります)。

可能なファイル形式を見つけたら、画像ライブラリの適切なルーチンを使用して画像の読み込みを試みることができます。それが失敗した場合、そもそも有効な画像ではありませんでした。

徹底的なテスト (たとえば、 BMP ファイルで始まるため、おそらくBMP ファイルであることがわかりますBM) は、はるかに手間のかかる作業です。次に、個別のイメージ タイプごとの仕様に従って、ファイル全体を読み取り、その内容全体を検証する必要があります。

于 2013-09-05T11:46:36.220 に答える