有没有快速的方法可以确定某个任意图像文件是png
文件还是jpeg
文件,还是没有?
我很确定有一些方法,这些文件可能有某种自己的签名,应该有一些方法来区分它们。
如果可能,您是否还可以在libpng
/ libjpeg
/ boost::gil::io
中提供相应例程的名称。
答案 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_read_image
会抛出std::ios_base::failure
。jpeg_read_image
会抛出std::ios_base::failure
。与其他Boost GIL例程类似。如果您只想要该类型,您可能只想尝试阅读dimensions,而不是加载整个文件。
答案 3 :(得分:1)
像PNG和JPG这样的图像文件类型具有明确定义的文件格式,其中包括标识它们的签名。您所要做的就是读取足够的文件来读取该签名。
您需要的签名有详细记录:
http://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header