Видел когда-нибудь стильные и лаконичные GIF-ки из командной строки и задумывался, как их создают? На самом деле, всё проще некуда: понадобится всего две команды — сейчас покажу, как это сделать.
VHS — утилита для создания GIF-анимаций на основе сценариев, а Gifsicle — мощный инструмент для их сжатия. Вместе они позволяют делать крутые и крохотные GIF-файлы, которые выглядят по-настоящему профессионально. Я расскажу, что такое VHS, как им пользоваться, и как уменьшить размер готовой анимации, чтобы она занимала меньше места, чем обычный PNG.
Демонстрация работы VHS
Лучше один раз увидеть, чем сто раз услышать, — вот тебе анимация, говорящая сама за себя:
Эта анимация из моей статьи про fzf. Для полноты — вот ещё один пример на ту же тему:
Согласись, выглядит эффектно! Всё на самом деле просто: никаких заморочек, а сами GIF-ки занимают минимум места. Например, первая — всего 223 КБ, вторая — всего 22 КБ. Вся магия — в связке VHS, Gifsicle и немного хитростей в командной строке.
Если ты ещё не пробовал fzf, советую сначала почитать, как установить и запустить этот инструмент — так ты сможешь повторить показанные примеры.
Главные фишки работы с VHS
В основе VHS — так называемый “tape-файл”. Это просто сценарий с командами, которые будут проиграны одна за другой прямо в терминале. Вот супер-простой пример:
Этот сценарий делает три элементарных действия:
Когда запускаешь этот tape-файл, видишь, как команда появляется в терминале, выполняется, а затем анимация повторяется с небольшой задержкой.
Чтобы получить GIF, просто напиши в терминале: vhs my-file.tape
Вот как выглядит результат:
Пишем свой сценарий!
Покажу чуть более сложный пример и поделюсь парой лайфхаков.
Что внутри tape-файла?
Этот tape-файл создаёт тот самый GIF с “иголкой в стоге сена”, который ты видел выше. Сейчас разберём каждую строчку:
Инструкция "Require" — просто проверяет, что у тебя установлен fzf. Если нет, сценарий не запустится.
"Output" — здесь всё просто: указываешь, во что сохранить результат — GIF, MP4, WebM или даже отдельные кадры для ручной обработки.
“Set” стоит написать в самом начале: здесь задаются настройки — ширина, высота, используемая оболочка, частота кадров и скорость печати текста. Всё прозрачно и понятно. Скорость печати можно менять где угодно, а остальные настройки — только в начале файла.
Я специально снизил частоту кадров — так размер картинки намного меньше, но иногда это портит анимацию. Если что-то пошло не так — увеличь Framerate или просто убери этот параметр.
Блок "Hide" — сюда добавляешь команды, которые не должны попасть в итоговый GIF. В нашем случае мы подготавливаем окружение для fzf и очищаем терминал, чтобы на GIF не было лишнего. Потом команда "Show" — именно после неё VHS начнёт записывать всё, что происходит.
С 17-й строки начинается show: команда cat показывает содержимое файла Lorem Ipsum — это наш стог сена. Команда Sleep нужна для плавности.
На 22-й строке снова выводим файл через cat и сразу передаём его в fzf, жмём Enter и начинаем набирать слово needle. Сценарий заканчивается длинной паузой, чтобы можно было все рассмотреть.
Итого: сначала показываем файл, потом ищем в нём нужное слово с помощью fzf.
Как сделать свой tape-файл
Перед тем как творить GIF по своему сценарию, убедись, что у тебя установлен fzf. Также потребуется текстовый файл (например, Lorem Ipsum). Для этого выполни команду:
Создай tape-файл c именем fzf-demo.tape, вставь в него свой сценарий и запусти команду для генерации GIF:
В итоге получишь GIF c названием "unoptimized.gif" — дальше его будем уменьшать.
Как сделать GIF ещё меньше
“Unoptimized.gif” у меня вышел на 1,2 МБ — маловато радости. Уменьшить файл поможет Gifsicle. Вот как его установить:
Если у тебя Fedora, введи:
На Debian — эта команда:
Для Arch Linux подойдёт такая:
Когда Gifsicle установишь, сожми “unoptimized.gif” командой:
После этого GIF будет весить около 228 КБ.
Мой главный трюк — использовать палитру на 8 бит, чтобы максимально уменьшить размер. На него больше всего влияет именно количество цветов, а не разрешение. Если у тебя в анимации много ярких или разных цветов, смело увеличивай палитру до 256, но тогда и вес GIF’а станет больше.
Можно дополнительно уменьшить GIF, если снизить fps. Я выставил 5 кадров в секунду — картинка остаётся чёткой, а файл реально небольшой. При низком fps получается много одинаковых кадров — Gifsicle их сам удаляет (флаг "-O3" или "-O2"), оставляя только необходимые и расставляя правильные задержки между ними.
Чекни сам: у оптимизированной версии кадров заметно меньше, а паузы между ними стали разными — это и есть супер-оптимизация.
Если твой GIF быстро меняется (например, печать текста молниеносная), при удалении одинаковых кадров размер падает просто в разы! В простых анимациях эффект не такой феноменальный, но разница всё равно чувствуется.
Кстати, VHS может сам записывать сценарии — просто повтори свои действия в терминале, выполнив vhs record > my.tape. Как только закончишь, напиши exit — ты не выйдешь из терминала, а VHS сохранит твой tape-файл. Останется только слегка его подредактировать.
Советую глянуть официальную документацию (она на GitHub). Бывают баги, но обычно всё работает без проблем — и главный плюс: всё гораздо проще, чем записывать полноценное видео с экрана. Не веришь? Проверь сам: один seans "record", минимальная правка сценария — и запускай свои две магические команды.
Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!
Премиум подписка - это доступ к эксклюзивным материалам, чтение канала без рекламы, возможность предлагать темы для статей и даже заказывать индивидуальные обзоры/исследования по своим запросам!Подробнее о том, какие преимущества вы получите с премиум подпиской, можно узнать здесь
Также подписывайтесь на нас в:
- Telegram: https://t.me/gergenshin
- Youtube: https://www.youtube.com/@gergenshin
- Яндекс Дзен: https://dzen.ru/gergen
- Официальный сайт: https://www-genshin.ru