Как распознать формат файла изображения, используя его содержимое? - PullRequest
2 голосов
/ 10 июля 2019

Если файл изображения имеет формат .png, тогда он будет содержать ‰ PNG в начале файла.(при чтении в режиме Текст )

Если файл изображения имеет формат .bmp, то он будет содержать BM в началефайла.(при чтении в режиме Текст )

Я знаю, что форматы изображений содержат текст (данные) определенного размера (в байтах) в начале файла, который используется в качестве метаданных изображенияfile?

Мои вопросы: -

  • Одинаково ли это поведение во всех форматах файлов изображений (или форматах в целом)?
  • Может ли файл изображения ( без расширения ) распознаваться только с использованием этих данных?

  • Доступна ли информация о том, как этометаданные разбиты?Под этим я подразумеваю, какое значение имеют данные в какой позиции в метаданных?

Ответы [ 2 ]

4 голосов
/ 12 июля 2019

Это поведение одинаково во всех форматах файлов изображений (или форматах в целом)?

Для большинства из них да.Есть несколько проприетарных форматов (например, для игр), которые могут иметь очень короткие метаданные или вообще не иметь их.Кроме того, метаданные могут находиться в другом файле (например, анимации вместе с метаданными XML).

Может ли файл изображения (без расширения) распознаваться только по этим данным?

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

В системах Unix есть file команда , которая определяетфайлы на основе их метаданных.Существует лучший инструмент для изображений, называемый identifier (часть ImageMagick) , который возвращает более подробную информацию о разрешении, битовой глубине и т. Д.

Доступна ли информация о том, как эти метаданныесломан?Под этим я подразумеваю, что данные в каком месте в метаданных имеют какое значение?

Существуют книги о форматах файлов (изображений), и для большинства форматов эта информация доступна в официальных спецификациях (например, * 1024).* RFC 2083 для PNG).Они перечисляют все (необязательное) содержимое файла, описывают сжатия и то, что зритель / декодер / кодировщик может / должен / должен сделать с данными.Хорошей отправной точкой может послужить список файлов изображений Wikipedia .

Обратите внимание, что на основании приведенных вами примеров я предполагаю, что вы открывали файлы в текстовом редакторе, который не является идеальным инструментом дляэта задача.Для этого лучше использовать hex-редактор .Текстовые редакторы не будут отображать большинство байтов (например, 255) по умолчанию и интерпретировать другие (например, табуляцию или перевод строки).Они могут быть достаточно хороши, чтобы видеть магические текстовые строки, такие как «BM» и «PNG», но с помощью шестнадцатеричного редактора вы можете видеть как эти текстовые части, так и их числовое представление - например, позволяя извлекать ширину и высоту изображения.Для этого полезен какой-то инструмент для преобразования шестнадцатеричных значений в десятичные, большинство калькуляторов могут это сделать.

В качестве примера давайте рассмотрим начало файла PNG с разрешением 6146x 14293 в текстовом и шестнадцатеричном редакторе:

Comparison between hex and text editor

Вы можете видеть, что файл представляет собой изображение PNG в обоих из них, это правильно,Но отмеченная часть в представлении шестнадцатеричного редактора покажет ширину и высоту изображения (в соответствии со спецификацией PNG части «IHDR» ) - 0x00001802 равно 6146 в десятичном виде, 0x000037D5 - это14293. Нет способа сделать это в текстовом редакторе.

Также обратите внимание, что даже если вы не знаете формат изображения, вам может повезти, просто предположив, что это несжатые данные (это часто работает в некоторых играхформаты графических файлов, наиболее известные «активы» Unity).Например, если вы переименуете файлы в «.raw», программа просмотра изображений IrfanView выдаст вам диалоговое окно (см. Скриншот ниже), где вы можете угадать ширину, высоту и битовую глубину изображения и посмотреть, получится ли результатвыглядит хорошо.Это требует некоторого опыта в интерпретации результата, хотя, если ширина и битовая глубина не совпадают, изображения будут выглядеть как шум, искажены или будут иметь неправильные цвета.

IrfanView screenshot

Это «угадывание геометрии изображения» можно улучшить / автоматизировать, попробовав разную ширину и вычислив коэффициент корреляции между двумя линиями.Инструмент raw2tiff может сделать это.Цитата с сайта:

Волшебства нет, это просто математическая статистика, поэтому в некоторых случаях она может ошибаться.Но для большинства обычных изображений метод угадывания будет работать нормально.

0 голосов
/ 12 июля 2019

Используя Imagemagick, вы можете получить эту информацию (если она доступна) для форматов, которые Imagemagick может прочитать из его «магических» данных в заголовочном файле, следующим образом:

convert image -format "%m\n" info:


Например:

convert lena.png -format "%m\n" info:
PNG

convert lena.jpg -format "%m\n" info:
JPEG

convert lena.pnm -format "%m\n" info:
PPM


Даже если суффикс удален, это все равно работает:

convert lena_copy -format "%m\n" info:
PNG
...