GIF — один из тех форматов, где сжатие пугает: жесткий лимит 256 цветов и покадровое хранение делают так, что нормальная анимация весит десятки мегабайт. А сжать «ещё немного» — уже потеря качества, которая видна невооружённым глазом. Разберём, откуда берётся вес GIF, и дадим конкретный план, как его уменьшить.
Откуда GIF берёт свой вес
Две особенности формата GIF определяют весь подход к сжатию.
Первая: индексированный цвет, максимум 256 оттенков. Каждый пиксель хранит не цвет, а номер в палитре. Сжатие GIF происходит в два этапа: сначала квантование — настоящее изображение сокращается до ≤256 цветов и строится палитра (вот где теряется качество), затем по индексированной последовательности проходит LZW — уже без потерь.
Ключевой момент: LZW — lossless на индексах, но все реальные потери происходят на этапе «уменьшить количество цветов». Чтобы уменьшить GIF, нужно управлять палитрой и кадрами; от LZW большого выигрыша ждать не стоит.
Вторая: анимация хранится покадрово. Каждый кадр несёт полноценные данные изображения, а соседние кадры почти идентичны — в GIF на 30 fps большинство кадров меняет лишь небольшую область. Оптимизаторы вроде gifsicle занимаются именно этим: находят разницу между кадрами, прозрачным или пропуском заменяют неизменные зоны и хранят только то, что реально сдвинулось. Если разобрать набор стикеров на отдельные кадры — первый всегда самый тяжёлый, каждый следующий меньше. Вот почему.
Три рычага, в порядке эффективности
Вес анимации ≈ пиксели × количество кадров × средний сжатый размер кадра. Работать по этим трём источникам дешевле, чем городить сложные оптимизации:
- Уменьшите разрешение. Меньше пикселей — меньше данных. С 500 px до 300 px размер падает сильнее линейно.
- Снизьте частоту кадров. С 15 fps до 8 fps кадров почти вдвое меньше. В GIF не нужна интерполяция — просто выбрасывайте кадры. Максимальный эффект на единицу усилий.
- Уменьшите палитру. С 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 fpsscale=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. Продолжать давить — только за счёт качества и частоты кадров; правильнее сменить формат.