有没有什么快速的方法可以确定某些任意图像文件是png
文件还是jpeg
文件或者它们都不是?C++ - 检测文件是PNG还是JPEG
我敢肯定有一些方法,这些文件可能有某种自己的签名,应该有一些方法来区分它们。
如果可能,您还可以提供相应例程的名称:libpng
/libjpeg
/boost::gil::io
。
有没有什么快速的方法可以确定某些任意图像文件是png
文件还是jpeg
文件或者它们都不是?C++ - 检测文件是PNG还是JPEG
我敢肯定有一些方法,这些文件可能有某种自己的签名,应该有一些方法来区分它们。
如果可能,您还可以提供相应例程的名称:libpng
/libjpeg
/boost::gil::io
。
除了:
png_read_image
抛出std::ios_base::failure
如果该文件不是有效的PNG文件。jpeg_read_image
如果文件不是有效的JPEG文件,则会抛出std::ios_base::failure
。与其他Boost GIL例程类似。如果您只需要该类型,则可能需要尝试仅读取dimensions,而不是加载整个文件。
查看文件开头的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
像PNG和JPG这样的图像文件类型具有明确定义的文件格式,其中包括标识它们的签名。你所要做的就是读足够的文件来读取签名。
您所需要的签名是有据可查的:
http://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header
这个问题基本上是由上面的答复回答的,但我想我会添加以下内容:如果您需要确定超出“JPEG,PNG,其他”的文件类型,总是有libmagic。这就是Unix实用程序文件的功能,这在许多现代操作系统上的确非常神奇。
还有一个问题说,所谓jpeg_read_image不会引发异常。 – jiggunjer 2015-06-17 17:03:27