2010-09-22 109 views
6

有没有什么快速的方法可以确定某些任意图像文件是png文件还是jpeg文件或者它们都不是?C++ - 检测文件是PNG还是JPEG

我敢肯定有一些方法,这些文件可能有某种自己的签名,应该有一些方法来区分它们。

如果可能,您还可以提供相应例程的名称:libpng/libjpeg/boost::gil::io

回答

2
从读取幻数 “手动” 蒂姆·耶茨的建议,升压GIL文件说

除了:

  • png_read_image抛出std::ios_base::failure如果该文件不是有效的PNG文件。
  • jpeg_read_image如果文件不是有效的JPEG文件,则会抛出std::ios_base::failure

与其他Boost GIL例程类似。如果您只需要该类型,则可能需要尝试仅读取dimensions,而不是加载整个文件。

+0

还有一个问题说,所谓jpeg_read_image不会引发异常。 – jiggunjer 2015-06-17 17:03:27

17

查看文件开头的magic number。从维基百科页面:

JPEG图像文件开始FF D8与FF D9结束。 JPEG/JFIF文件 包含“JFIF”(4A 46 49 46)的ASCII码作为空终止字符串。 JPEG/Exif文件包含“Exif”(45 78 69 66)的ASCII代码 ,也可以作为 以空字符结尾的字符串,然后是 关于该文件的更多元数据。

PNG图像文件开始与文件标识为 PNG文件并允许 普通文件传输问题检测一个8字节的签名:\ 211 P NG \ r \ n \ 032 \ n

3

这个问题基本上是由上面的答复回答的,但我想我会添加以下内容:如果您需要确定超出“JPEG,PNG,其他”的文件类型,总是有libmagic。这就是Unix实用程序文件的功能,这在许多现代操作系统上的确非常神奇。

相关问题