C ++ - 检测文件是PNG还是JPEG

时间:2010-09-22 15:06:13

标签: c++ image png jpeg

有没有快速的方法可以确定某个任意图像文件是png文件还是jpeg文件,还是没有?

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

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

4 个答案:

答案 0 :(得分:20)

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

  

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

     

PNG图像文件以8字节签名开头,将文件标识为   一个PNG文件,允许检测   常见的文件传输问题:\ 211 P.   N G \ r \ n \ 032 \ n

答案 1 :(得分:3)

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

答案 2 :(得分:2)

除了蒂姆耶茨建议“手动”阅读神奇数字之外,Boost GIL文档说:

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

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

答案 3 :(得分:1)

像PNG和JPG这样的图像文件类型具有明确定义的文件格式,其中包括标识它们的签名。您所要做的就是读取足够的文件来读取该签名。

您需要的签名有详细记录:

http://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header

http://en.wikipedia.org/wiki/JPEG#Syntax_and_structure