Подробный гайд: Как узнать версию и MIME-тип GIF, почему у .gif нет текстовой кодировки

Гайд: как узнать версию и MIME-тип GIF, почему у .gif нет текстовой кодировки, и как проверить заголовок, палитру и комментарии через file, ExifTool, ImageMagick, Python.

2026.09.19                  


Подробный гайд: Как узнать версию и MIME-тип GIF, почему у .gif нет текстовой кодировкиПодробный гайд: Как узнать версию и MIME-тип GIF, почему у .gif нет текстовой кодировки

Важно:

у GIF нет текстовой кодировки вроде UTF-8, Windows-1251 или KOI8-R. GIF — это бинарный формат изображения. Если вы откроете его в текстовом редакторе и он спросит кодировку, правильный ответ — «бинарный» / «не текст». Для файла .gif обычно указывают MIME-тип image/gif, а charset — binary.


Но под «кодировкой» часто понимают одно из:

  1. Версию формата GIFGIF87a или GIF89a.
  2. Тип файла / MIMEimage/gif.
  3. Глубину цвета, палитру, сжатие LZW.
  4. Кодировку текста внутри комментария GIF — но она не стандартизирована.



1. Самый быстрый способ: команда file

Linux / macOS / WSL / Git Bash:

file image.gif

Пример вывода:

image.gif: GIF image data, version 89a, 500 x 500

Здесь видно:

  • формат — GIF;
  • версия — 89a;
  • размер — 500×500.

Проверить MIME и charset:

file -i image.gif

или:

file --mime-encoding image.gif

Пример:

image.gif: image/gif; charset=binary

То есть текстовой кодировки нет — файл бинарный.


2. Посмотреть версию GIF через hex-редактор

Заголовок GIF состоит из первых 6 байт:

Смещение Байты Значение
0–2 GIF сигнатура формата
3–5 87a или 89a версия GIF

Linux / macOS

xxd -l 16 image.gif

или:

hexdump -C -n 16 image.gif

Пример:

00000000: 47 49 46 38 39 61 90 01 20 01 87 00 00  GIF89a.. ...

Расшифровка:

  • 47 49 46 = GIF
  • 38 39 61 = 89a

Значит, это GIF89a.


Windows

Программы:

  • HxD
  • 010 Editor
  • Notepad++ с плагином Hex Editor

Откройте файл и посмотрите первые 6 байт. Если видите GIF89a — версия 89a.


Через PowerShell:

$bytes = [System.IO.File]::ReadAllBytes("C:\path\image.gif")
[System.Text.Encoding]::ASCII.GetString($bytes[0..5])

Или в PowerShell 7:

Format-Hex -Path .\image.gif -Count 16

В старом PowerShell:

Get-Content -Path .\image.gif -Encoding Byte -TotalCount 16 | Format-Hex

3. Что ещё видно в заголовке GIF

После первых 6 байт идёт Logical Screen Descriptor:

Смещение Размер Что означает
6–7 2 байта ширина в пикселях, little-endian
8–9 2 байта высота в пикселях, little-endian
10 1 байт packed fields: наличие глобальной палитры, цветовое разрешение, размер палитры
11 1 байт индекс фонового цвета
12 1 байт pixel aspect ratio

Байт 10:

  • бит 7 — есть ли Global Color Table;
  • биты 6–4 — color resolution;
  • бит 3 — sort flag;
  • биты 2–0 — размер глобальной палитры.

Размер палитры = 3 * 2^(N+1) байт, где N — младшие 3 бита байта 10. Но для бытовой задачи обычно достаточно знать: GIF87a — старый формат, GIF89a — поддерживает анимацию, прозрачность, комментарии и Plain Text Extension.


4. ExifTool — удобно и кроссплатформенно

Установите ExifTool, затем:

exiftool image.gif

Более кратко:

exiftool -GIFVersion -Comment -ImageSize -ColorResolutionDepth -BitsPerPixel image.gif

Пример вывода:

GIF Version                     : 89a
Image Size                      : 500x500
Color Resolution Depth          : 8
Bits Per Pixel                  : 8
Comment                         : ...

ExifTool также покажет комментарии, если они есть.


5. ImageMagick

Linux / macOS / Windows:

identify -verbose image.gif

Или в ImageMagick 7:

magick identify -verbose image.gif

Ищите строки:

Format: GIF
Version: GIF89a
Geometry: 500x500
Colorspace: sRGB
Depth: 8-bit
Compression: LZW
Interlace: None

Это даёт больше информации о цвете, сжатии и чересстрочности.


6. FFmpeg / ffprobe

ffprobe -v error -show_entries stream=codec_name,width,height,pix_fmt -of default=nw=1 image.gif

Пример:

codec_name=gif
width=500
height=500
pix_fmt=bgra

FFmpeg полезен, если GIF надо потом конвертировать или анализировать как видео/анимацию.


7. Python + Pillow

Если нужно посмотреть программно:

from PIL import Image

im = Image.open("image.gif")

print("Формат:", im.format)
print("Версия:", im.info.get("version"))
print("Размер:", im.size)
print("Режим:", im.mode)
print("Инфо:", im.info)

im.info может содержать:

  • versionb'89a' или b'87a';
  • comment;
  • duration;
  • loop;
  • transparency.



Пример разбора заголовка вручную:

with open("image.gif", "rb") as f:
    header = f.read(13)

print(header[:3])        # b'GIF'
print(header[3:6])       # b'89a' или b'87a'
print(header[6] | (header[7] << 8))   # ширина
print(header[8] | (header[9] << 8))   # высота

8. Если нужна кодировка текста внутри GIF-комментария

В GIF89a может быть Comment Extension. Но стандарт не задаёт, в какой кодировке этот комментарий. Там может быть ASCII, UTF-8, CP1251, Latin-1 и что угодно.

Извлечь комментарий:

exiftool -b -Comment image.gif > comment.txt

Потом определить кодировку текста:

file -i comment.txt
uchardet comment.txt

Или через Python:

from PIL import Image

im = Image.open("image.gif")
comment = im.info.get("comment")

if isinstance(comment, bytes):
    for enc in ("utf-8", "cp1251", "latin-1"):
        try:
            print(enc, "=>", comment.decode(enc))
            break
        except UnicodeDecodeError:
            pass
else:
    print(comment)

Но ещё раз: это кодировка комментария, а не самого GIF-файла.


9. Если .gif на самом деле не GIF

Бывает, что файл переименовали в .gif, но внутри текст, ZIP или другой формат.

Проверьте:

file image.gif
file -i image.gif

Если вывод не начинается с GIF image data, значит, это не настоящий GIF. Тогда уже можно говорить о текстовой кодировке, если внутри текст.


Важно

  • Текстовой кодировки у GIF нет. Для него charset=binary.
  • Быстро проверить: file -i image.gifimage/gif; charset=binary.
  • Версию GIF смотреть так: file image.gif или первые 6 байт в hex: GIF87a / GIF89a.
  • Подробные параметры: exiftool image.gif, identify -verbose image.gif, ffprobe image.gif.
  • Кодировку комментария внутри GIF можно попытаться определить отдельно, но стандарта для неё нет.

Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.


Статью подготовил: Аверко Денис Сергеевич @Nymexis г. Омск (специалист по ЗИ)

Комментарии

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