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