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

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

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

БОНУС: что, если изображение представляет собой строку в кодировке Base64? Какой-нибудь надежный способ вывести это перед декодированием?


person Tom Kidd    schedule 09.09.2008    source источник


Ответы (4)


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

person Greg Hewgill    schedule 09.09.2008
comment
За исключением Targa, у которого в конце есть магические числа, и некоторых разновидностей RAW, которые совершенно неотличимы от TIFF, за исключением того, что они не декодируются (или наоборот). - person plinth; 16.12.2009

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

Битмап будет начинаться с Qk3

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

GIF начинается с R0l (это ноль в качестве второго символа).

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

person LarryF    schedule 19.09.2008

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

person hamishmcn    schedule 12.09.2008

person    schedule
comment
Yikes что-то вроде опасно. Есть два допустимых заголовка tiff: 49 49 2a 00 или 4d 4d 00 2a. формат 49 49 использует порядок байтов Intel (little endian) в большей части файла, 4d 4d использует байт Motorola (big endian), что означает, что 2a и 00 меняются местами с Intel. - person plinth; 16.12.2009