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

1

如上所述,最好的办法是在 CImg 抛出异常时捕获异常,并在发生时跳过该特定文件。就像是 :

CImg<> img;
const char *const filename[] = { "foo.txt", "foo.bmp", "foo.jpg" }
for (unsigned int i = 0; i<3; ++i) {
   try { img.load(filename[i]); } catch (CImgException) { img.assign(); }
   if (img) {
       .. Do what you want on your image now.
   } 
}
于 2013-10-11T08:52:44.557 回答
0

好吧,答案很简单(至少对我而言): Cimg 异常处理:http ://cimg.sourceforge.net/reference/structcimg__library_1_1CImgException.html

这样我就可以继续处理下一张图像

于 2013-10-09T14:04:01.540 回答
0

我的 CImg (148) 版本有一个功能file_type()。这不可靠吗?

于 2014-03-07T22:40:20.560 回答
0

您是否需要详尽的测试,还是只需要在多个候选人之间进行区分?

要快速找到合适的文件类型,您需要做的就是从文件中读取第一个字节。然后,

  • 如果这些是'BM'Windows BMP
  • 如果这些是0x89 'PNG'PNG
  • 两者都'II'表示'MM'一个 TIFF 文件
  • 该序列0xFF 0xD8 0xFF 0xE0是 JPEG 文件的典型开头(还有其他一些)。

找到可能的文件格式后,您可以尝试在图像库中使用正确的例程加载图像,如果失败,则该图像一开始就不是有效的图像。

一个详尽的测试——比如说,你发现它可能是一个 BMP 文件,因为它以它开头BM——需要更多的工作。然后,您需要根据每个单独图像类型的规范读取整个文件并验证其全部内容。

于 2013-09-05T11:46:36.220 回答