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