▸_ffmpegtool
~/blog/gif-compression-guide
GIF15 сент. 2026 г. · 8 min

Почему GIF такой большой? Как сжать GIF

Жёсткий лимит 256 цветов и покадровое хранение — вот откуда берётся вес. Как работают квантование, LZW и gifsicle, и какие три рычага реально уменьшают файл.

GIF — один из тех форматов, где сжатие пугает: жесткий лимит 256 цветов и покадровое хранение делают так, что нормальная анимация весит десятки мегабайт. А сжать «ещё немного» — уже потеря качества, которая видна невооружённым глазом. Разберём, откуда берётся вес GIF, и дадим конкретный план, как его уменьшить.

Откуда GIF берёт свой вес

Две особенности формата GIF определяют весь подход к сжатию.

Первая: индексированный цвет, максимум 256 оттенков. Каждый пиксель хранит не цвет, а номер в палитре. Сжатие GIF происходит в два этапа: сначала квантование — настоящее изображение сокращается до ≤256 цветов и строится палитра (вот где теряется качество), затем по индексированной последовательности проходит LZW — уже без потерь.

Ключевой момент: LZW — lossless на индексах, но все реальные потери происходят на этапе «уменьшить количество цветов». Чтобы уменьшить GIF, нужно управлять палитрой и кадрами; от LZW большого выигрыша ждать не стоит.

Вторая: анимация хранится покадрово. Каждый кадр несёт полноценные данные изображения, а соседние кадры почти идентичны — в GIF на 30 fps большинство кадров меняет лишь небольшую область. Оптимизаторы вроде gifsicle занимаются именно этим: находят разницу между кадрами, прозрачным или пропуском заменяют неизменные зоны и хранят только то, что реально сдвинулось. Если разобрать набор стикеров на отдельные кадры — первый всегда самый тяжёлый, каждый следующий меньше. Вот почему.

Три рычага, в порядке эффективности

Вес анимации ≈ пиксели × количество кадров × средний сжатый размер кадра. Работать по этим трём источникам дешевле, чем городить сложные оптимизации:

  1. Уменьшите разрешение. Меньше пикселей — меньше данных. С 500 px до 300 px размер падает сильнее линейно.
  2. Снизьте частоту кадров. С 15 fps до 8 fps кадров почти вдвое меньше. В GIF не нужна интерполяция — просто выбрасывайте кадры. Максимальный эффект на единицу усилий.
  3. Уменьшите палитру. С 256 до 128 или 64 цветов. Фотографии переносят 128 практически без потерь; мультяшный и плоский контент — можно ниже.

А уже потом идут оптимизаторы:

  • Без потерь: gifsicle -O3 input.gif -o out.gif. Флаг -O — уровень оптимизации: O1 убирает избыточность, O2 добавляет попиксельную разницу и прозрачность, O3 перебирает алгоритмы и выбирает лучший.
  • С потерями: gifsicle -O3 --lossy=30 input.gif -o out.gif. --lossy работает в диапазоне 0–200, на каждый день берут 20–50 — допустимо потерять несколько пикселей ради ещё 20–30% экономии.

У lossless есть потолок

Будем честны: оптимизация без потерь даёт скромный результат. Она лишь убирает избыточность и склеивает повторяющиеся кадры. Если GIF уже был экспортирован инструментом с оптимизацией — повторный -O3 почти ничего не даст. Скринкаст на 19.8 МБ после полного lossless-прохода стал 19.6 МБ — это норма, а не сломанная команда.

Чтобы реально уменьшить файл, нужен один из рычагов выше: разрешение, частота кадров, палитра или lossy-режим. Не гоняйте lossless по кругу.

Видео → GIF: параметры решают всё

Две типичные ошибки при конвертации: слишком высокая частота кадров и отсутствие палитры. Видео идёт на 30/60 fps — GIF столько не нужно. Для медленного движения 6–10 fps достаточно, для быстрого — максимум 12–15.

FFmpeg требует связку palettegen + paletteuse: сначала вычисляется оптимальная палитра по всему ролику, потом в неё конвертируются кадры. Если просто указать -c:v gif, цвета поедут или каждая кадр получит свою палитру — вес подскочит:

ffmpeg -i input.mp4 -vf "fps=10,scale=480:-1,split[a][b];[a]palettegen=max_colors=128[p];[b][p]paletteuse=dither=bayer:bayer_scale=5" -loop 0 -y out.gif
  • fps=10 — прореживание до 10 fps
  • scale=480:-1 — ширина 480, высота по пропорции
  • palettegen=max_colors=128 — палитра на 128 цветов
  • dither=bayer — дизеринг: несколько цветов имитируют плавные переходы
  • -loop 0 — бесконечный цикл

GIF или MP4/WebM?

Эффективность кодирования GIF многократно уступает H.264/VP9 — тот же ролик в MP4/WebM часто весит на порядок меньше и поддерживает 16 млн цветов. Поэтому не пытайтесь запихнуть всё в GIF:

  • Сложная картинка, дольше пары секунд, важны цвета → переходите на MP4/WebM
  • Простая петля, старая платформа, нужен именно файл .gif → тогда GIF

Наши инструменты видео в GIF и сжатие GIF работают по этой логике прямо в браузере, без загрузки на сервер.

FAQ

В: Можно ли ужать GIF до размера MP4? О: Нет. Индексированный цвет и покадровое хранение ставят потолок сжатия GIF существенно ниже современных видеокодеков. При том же содержимом GIF всегда будет тяжелее MP4/WebM. Продолжать давить — только за счёт качества и частоты кадров; правильнее сменить формат.

RELATED TOOLS · Примените это на практике