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

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

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

БОНУС. Что, если изображение является строкой, кодированной Base64? Любой надежный способ сделать это до его декодирования?

Ответ 1

В большинстве форматов файлов изображений есть уникальные байты в начале. Команда unix file смотрит в начало файла, чтобы увидеть, какой тип данных он содержит. См. Статью Википедии о Магические числа в файлах и magicdb.org.

Ответ 2

Конечно, есть. Как и другие, упомянутые выше, большинство изображений начинаются с какого-то "Магического", который всегда переводится на какие-то данные Base64. Ниже приведены несколько примеров:

Растровое изображение начнется с Qk3

Jpeg начнется с /9j/

GIF начнется с R0l (это нуль как второй char).

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

Ответ 3

Либо file в командной строке * nix, либо чтение начальных байтов файла. Большинство файлов имеют уникальный заголовок в первых байтах. Например, заголовок TIFF выглядит примерно так:

0x00000000: 4949 2a00 0800 0000
Для получения дополнительной информации о формате файла TIFF специально, если вы хотите знать, что означают эти байты, перейдите здесь.

Ответ 4

Полный сайт форматов файлов доступен по адресу:

http://www.wotsit.org

Ответ 5

TIFF начнутся либо с II, либо с MM (заказ байта Intel или Motorolla).
Спецификацию TIFF 6 можно скачать здесь и не слишком сложно следовать