我正在使用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,但是忽略后缀,有没有正确的方法来测试呢?不涉及其他依赖项/库。
由于
答案 0 :(得分: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.
}
}
答案 1 :(得分:0)
您是否需要详尽测试,或者您只需要在众多候选人之间有所区别?
要快速找到合适的文件类型,您只需要读取文件中的第一个字节。然后,
'BM'
则是Windows BMP 0x89 'PNG'
则是PNG 'II'
和'MM'
都表示TIFF文件0xFF 0xD8 0xFF 0xE0
是JPEG文件的典型开头(还有其他一些)。找到可能的文件格式后,您可以尝试在图像库中使用正确的例程加载图像,如果失败则不能开始使用有效图像。
详尽的测试 - 比如说,你发现它可能是一个BMP文件,因为它以BM
开头 - 是更多的工作。然后,您需要根据每个单独图像类型的规范读取整个文件并验证其全部内容。
答案 2 :(得分:0)
嗯,答案是(至少我的目的)简单:Cimg异常处理:http://cimg.sourceforge.net/reference/structcimg__library_1_1CImgException.html
这样我可以继续处理下一张图像
答案 3 :(得分:0)
我的CImg版本(148)有一个函数file_type()
。这不可靠吗?