Подробный гайд: Как узнать версию и MIME-тип GIF, почему у .gif нет текстовой кодировки
Важно:
у GIF нет текстовой кодировки вроде UTF-8, Windows-1251 или KOI8-R. GIF — это бинарный формат изображения. Если вы откроете его в текстовом редакторе и он спросит кодировку, правильный ответ — «бинарный» / «не текст». Для файла .gif обычно указывают MIME-тип image/gif, а charset — binary.
Но под «кодировкой» часто понимают одно из:
- Версию формата GIF —
GIF87aилиGIF89a. - Тип файла / MIME —
image/gif. - Глубину цвета, палитру, сжатие LZW.
- Кодировку текста внутри комментария 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=GIF38 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 может содержать:
version—b'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.gif→image/gif; charset=binary. - Версию GIF смотреть так:
file image.gifили первые 6 байт в hex:GIF87a/GIF89a. - Подробные параметры:
exiftool image.gif,identify -verbose image.gif,ffprobe image.gif. - Кодировку комментария внутри GIF можно попытаться определить отдельно, но стандарта для неё нет.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.