C ++ - определить, является ли файл в формате PNG или JPEG - PullRequest
6 голосов
/ 22 сентября 2010

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

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

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

Ответы [ 4 ]

20 голосов
/ 22 сентября 2010

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

Файлы изображений 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

3 голосов
/ 22 сентября 2010

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

2 голосов
/ 22 сентября 2010

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

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

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

1 голос
/ 22 сентября 2010

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

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

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

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

...