Ответ 1
В большинстве форматов файлов изображений есть уникальные байты в начале. Команда unix file
смотрит в начало файла, чтобы увидеть, какой тип данных он содержит. См. Статью Википедии о Магические числа в файлах и magicdb.org.
Есть ли хороший способ увидеть, какой формат изображения, без необходимости читать весь файл в памяти?
Очевидно, это будет отличаться от формата к формату (меня особенно интересуют файлы TIFF), но какая процедура была бы полезна для определения того, какой формат изображения является файлом без необходимости читать весь файл?
БОНУС. Что, если изображение является строкой, кодированной Base64? Любой надежный способ сделать это до его декодирования?
В большинстве форматов файлов изображений есть уникальные байты в начале. Команда unix file
смотрит в начало файла, чтобы увидеть, какой тип данных он содержит. См. Статью Википедии о Магические числа в файлах и magicdb.org.
Конечно, есть. Как и другие, упомянутые выше, большинство изображений начинаются с какого-то "Магического", который всегда переводится на какие-то данные Base64. Ниже приведены несколько примеров:
Растровое изображение начнется с Qk3
Jpeg начнется с /9j/
GIF начнется с R0l
(это нуль как второй char).
И так далее. Не сложно брать разные типы изображений и выяснить, что они кодируют. Просто будьте осторожны, поскольку некоторые из них имеют более чем одну магию, поэтому вам нужно учитывать их в коде перевода B64.
Либо file
в командной строке * nix, либо чтение начальных байтов файла. Большинство файлов имеют уникальный заголовок в первых байтах. Например, заголовок TIFF выглядит примерно так:
0x00000000: 4949 2a00 0800 0000Для получения дополнительной информации о формате файла TIFF специально, если вы хотите знать, что означают эти байты, перейдите здесь.
Полный сайт форматов файлов доступен по адресу:
TIFF начнутся либо с II, либо с MM (заказ байта Intel или Motorolla).
Спецификацию TIFF 6 можно скачать здесь и не слишком сложно следовать