C++ - определить, является ли файл PNG или JPEG

есть ли быстрый способ определить, является ли какой-либо произвольный файл изображения или jpeg файл или ни один из них?

Я уверен, что есть какой-то способ, и эти файлы, вероятно, имеют какие-то свои собственные подписи, и должен быть какой-то способ их различать.

если возможно, не могли бы вы также указать имена соответствующих подпрограмм в libpng / libjpeg / boost::gil::io.

4 ответов


помимо предложения Тима Йейтса прочитать магическое число "вручную", документация Boost GIL говорит:

  • png_read_image закидываем std::ios_base::failure если файл не является допустимым PNG-файлом.
  • jpeg_read_image закидываем std::ios_base::failure если файл не является допустимым файлом JPEG.

аналогично для других подпрограмм Boost GIL. Если вам нужен только тип, вы можете попробовать прочитать только размеры, а не загрузки всего файла.


посмотреть магическое число в начале файла. Со страницы Википедии:

файлы изображений JPEG начинаются с FF D8 и заканчиваются FF D9. Файлы JPEG/JFIF содержит код ASCII для "JFIF" (4A 46 49 46) как нуль-терминированная строка. Файлы JPEG / Exif содержат код ASCII для "EXIF" (45 78 69 66) также как нуль-терминированная строка, вслед за дополнительные метаданные о файле.

PNG файлы изображений начинаются с 8-байтового подпись, идентифицирующая файл как файл PNG и позволяет выявить общие проблемы с передачей файлов: \211 P N G \r \n \ 032 \n


на вопрос по существу отвечают приведенные выше ответы, но я думал, что добавлю следующее: Если вам когда-либо нужно определить типы файлов, кроме "JPEG, PNG, other", всегда есть libmagic. Это то, что приводит в действие утилиту Unix , что действительно довольно волшебно, на многих современных операционных системах.


типы файлов изображений, такие как PNG и JPG, имеют четко определенные форматы файлов, которые включают подписи, идентифицирующие их. Все, что вам нужно сделать, это прочитать достаточно файла, чтобы прочитать эту подпись.

подписи, которые вам нужны, хорошо документированы:

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

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