Zopflipng - скачать полную версию бесплатно на русском

Zopflipng: оптимизация PNG-файлов

Zopflipng: оптимизация PNG-файлов

ZopfliPNG, чаще запускаемый командой zopflipng, — это специализированная консольная программа для оптимизации файлов PNG. Она не редактирует изображение как графический редактор, не накладывает фильтры, не меняет размер холста и не предлагает визуальный интерфейс. Ее задача уже: взять готовый PNG-файл, переупаковать его внутренние данные и получить более компактный PNG, который по-прежнему открывается в браузерах, редакторах, просмотрщиках изображений и сборочных пайплайнах.

Выбор редакции

Скачать Zopflipng бесплатно

Рекомендуем

ФотоМАСТЕР

  • Простой интерфейс
  • Ретушь и замена фона
  • Фильтры и автокоррекция
  • Быстрая обработка фото

Zopflipng

  • Сложнее простых редакторов
  • Может быть избыточна для быстрых правок
  • Нужно время на освоение
  • Не все функции нужны новичку

Программа относится к инструментам финальной оптимизации: ее логично запускать после того, как изображение уже создано, обрезано, экспортировано из редактора, собрано из спрайтов или подготовлено как ассет интерфейса. ZopfliPNG работает с форматом Portable Network Graphics и фокусируется на том, что внутри PNG сильнее всего влияет на размер файла: Deflate-сжатие, IDAT-данные, фильтры строк изображения, цветовой тип, битовая глубина, прозрачность и дополнительные PNG chunks.

В отличие от универсальных программ для сжатия картинок, zopflipng не пытается быть удобным комбайном. Это утилита командной строки: ее интерфейс состоит из команды, входного файла, выходного файла и набора параметров. Такой подход неудобен для ручного перетаскивания изображений мышью, зато хорошо подходит для автоматизации, скриптов, CI/CD, npm scripts, Makefile, подготовки web assets и повторяемой оптимизации PNG в проекте.

ZopfliPNG использует Zopfli-сжатие для Deflate-стадии, сравнивает несколько стратегий выбора PNG scanline filters, подбирает подходящий color type, удаляет несущественные метаданные и умеет выполнять отдельные контролируемые преобразования вроде очистки скрытых цветов за полностью прозрачными пикселями или перевода 16-bit каналов в 8-bit. Эти возможности делают его не просто сжимателем PNG, а инструментом тонкой переупаковки PNG-файла под веб и статическую доставку.

Что такое ZopfliPNG и почему команда называется zopflipng

Название программы складывается из двух частей: Zopfli и PNG. Zopfli — это алгоритм плотного Deflate/zlib/gzip-сжатия, разработанный для случаев, где размер результата важнее скорости кодирования. PNG, в свою очередь, использует Deflate внутри IDAT-потоков, поэтому более тщательный Deflate-энкодер может уменьшить PNG без перехода в другой формат.

Команда запуска называется zopflipng. В реальной работе пользователь обычно видит именно это имя:

zopflipng input.png output.png

В документации и обсуждениях встречаются оба варианта написания:

Название Что означает
ZopfliPNG название PNG-оптимизатора как программы
zopflipng имя исполняемой команды в терминале
Google Zopfli родительский проект, внутри которого находится PNG-утилита
Zopfli compression алгоритмическая основа Deflate-сжатия

Важно не путать zopflipng с командой zopfli. Команда zopfli работает с обычными потоками gzip, zlib или raw Deflate, а zopflipng предназначен именно для PNG-файлов. Для изображений используется zopflipng, потому что PNG — это не просто данные, сжатые Deflate, а контейнер со структурой chunks, заголовком IHDR, IDAT-потоками, палитрой, прозрачностью, цветовым типом, битовой глубиной и служебными блоками.

Основная идея программы

Обычный PNG-файл уже сжат. Поэтому ZopfliPNG не сжимает несжатую картинку в бытовом смысле, а переупаковывает уже существующий PNG. Программа читает исходный файл, декодирует данные изображения, пробует другие способы представления этих данных внутри PNG и записывает новый файл, если результат получается меньше.

Внутри процесса важны четыре вещи:

  1. Deflate-поток.
    PNG хранит основную растровую информацию в IDAT chunks, где данные сжаты Deflate. Zopfli пытается найти более плотное Deflate-представление.

  2. PNG-фильтры строк.
    Перед сжатием PNG может применять фильтр к каждой строке изображения. Фильтр не ухудшает картинку, но меняет последовательность байтов так, чтобы она лучше сжималась.

  3. Цветовой тип.
    Если изображение технически можно представить проще, например не как RGBA, а как grayscale + alpha, программа может выбрать более компактный вариант.

  4. Служебные chunks.
    PNG может содержать текст, гамму, цветовой профиль, физический размер пикселя, комментарии и другие ancillary chunks. ZopfliPNG по умолчанию оставляет только важные для изображения блоки: IHDR, PLTE, tRNS, IDAT, IEND.

Именно поэтому результат зависит от исходника. На одном PNG выигрыш может быть заметным, на другом — почти нулевым, а на уже тщательно оптимизированном файле программа может сохранить оригинал, потому что новая версия не станет меньше. В коде zopflipng предусмотрена проверка результата: если новый файл не меньше, программа может сохранить исходный PNG вместо ухудшения размера.

Для каких задач подходит ZopfliPNG

ZopfliPNG лучше всего раскрывается в задачах, где PNG нужен именно как PNG, а не как промежуточный формат перед конвертацией в WebP или AVIF. Это важно для интерфейсной графики, документации, репозиториев, статических сайтов и библиотек, где требуется максимально совместимый файл без изменения расширения.

Программа хорошо подходит для:

  • PNG-иконок;

  • маленьких интерфейсных ассетов;

  • скриншотов документации;

  • UI-макетов с прозрачностью;

  • схем, диаграмм и технических изображений;

  • изображений с резкими границами и небольшим числом цветов;

  • статичных PNG-файлов в frontend-проекте;

  • автоматической оптимизации перед коммитом;

  • финального прохода по изображениям перед публикацией сайта;

  • обработки файлов, где нельзя использовать JPEG из-за прозрачности или четких линий.

ZopfliPNG особенно уместен там, где файл будет скачиваться много раз, а сжимается один раз. Например, иконка в интерфейсе сайта может быть оптимизирована медленно, зато потом тысячи пользователей будут получать меньший файл. Это типичный сценарий для zopflipng: потратить больше CPU-времени на этапе подготовки и выиграть в размере статического ресурса.

Для фотографий ZopfliPNG обычно не является главным выбором. Фотографии в PNG почти всегда слишком тяжелые, и для них чаще подходят JPEG, WebP или AVIF. ZopfliPNG может уменьшить PNG-фотографию, но сама идея хранить фотографию в PNG часто нерациональна. Другое дело — скриншоты интерфейсов, где много текста, ровных областей, линий, прозрачности и повторяющихся паттернов. Там PNG остается уместным, а zopflipng может дать полезный выигрыш.

Что именно умеет программа

ZopfliPNG — узкая утилита, но внутри своей области у нее достаточно много режимов. Она не ограничивается одной командой сжать файл, а позволяет управлять балансом между скоростью, размером, безопасностью перезаписи и сохранением metadata chunks.

Deflate-сжатие через Zopfli

Главная функция программы — использование Zopfli для Deflate-сжатия PNG-данных. PNG совместим с обычными декодерами, потому что формат результата остается стандартным PNG. Меняется не формат, а плотность внутреннего Deflate-потока.

Это принципиально отличается от конвертации PNG в WebP или AVIF. После zopflipng файл остается PNG:

zopflipng icon.png icon.optimized.png

Выходной файл по-прежнему можно использовать в <img src="icon.optimized.png">, CSS, README, документации, мобильных ресурсах и обычных каталогах ассетов.

Подбор PNG-фильтров

PNG-фильтр применяется перед Deflate-сжатием и может сильно повлиять на итоговый размер. ZopfliPNG умеет пробовать разные filter strategies:

Обозначение Стратегия
0 все scanlines получают PNG filter type 0
1 все scanlines получают filter type 1
2 все scanlines получают filter type 2
3 все scanlines получают filter type 3
4 все scanlines получают filter type 4
m minimum sum
e entropy
p predefined, то есть сохранение фильтров из входного PNG
b brute force, экспериментальный вариант

Базовый пример с ручным набором фильтров:

zopflipng --filters=0me input.png output.png

Для единичного важного файла можно включить полный перебор:

zopflipng --iterations=500 --filters=01234mepb input.png output.png

Такой запуск не нужен для каждого изображения. Он медленный, но полезен, когда нужно выжать максимум из конкретного PNG: логотипа, иконки, ключевого скриншота или графического ассета, который часто загружается пользователями.

Подбор цветового типа

ZopfliPNG может выбрать более подходящий PNG color type, если изображение допускает более компактное представление без визуальной потери. Например, файл может быть сохранен как RGBA, хотя фактически все цветные пиксели серые и достаточно grayscale + alpha. В таком случае более простой color type уменьшает объем данных до Deflate.

Для случаев, где исходный тип нужно сохранить, есть параметр:

zopflipng --keepcolortype input.png output.png

--keepcolortype полезен, когда файл предназначен для среды с ограничениями по декодированию или когда в пайплайне важно не менять исходный PNG color type и bit depth. Цена такого решения — меньше возможностей для сжатия, потому что программа не сможет выбрать более компактное представление.

Удаление несущественных chunks

PNG может хранить не только пиксели. В нем бывают текстовые комментарии, gamma-информация, ICC-профиль, DPI/physical pixel size, сведения о времени изменения и другие ancillary chunks. Для веб-ассетов это часто лишний вес.

ZopfliPNG по умолчанию оставляет только essential chunks: IHDR, PLTE, tRNS, IDAT, IEND. Это дает компактный файл, но требует аккуратности, если изображение зависит от цветового профиля, gamma correction или физического размера.

Для сохранения отдельных chunks используется --keepchunks:

zopflipng --keepchunks=gAMA,pHYs input.png output.png

Более осторожный вариант для изображений, где важна цветопередача:

zopflipng --keepchunks=cHRM,gAMA,iCCP,sRGB input.png output.png

Если нужен физический размер пикселя или DPI-подобная информация, добавляют pHYs:

zopflipng --keepchunks=cHRM,gAMA,iCCP,sRGB,pHYs input.png output.png

Формат параметра строгий: имена chunks передаются через запятую, каждое имя состоит из четырех символов. Если формат неправильный, программа выводит ошибку с примером вида --keepchunks=gAMA,cHRM,sRGB,iCCP.

Очистка скрытых цветов прозрачных пикселей

Параметр --lossy_transparent удаляет цвета, которые находятся за полностью прозрачными пикселями:

zopflipng --lossy_transparent input.png output.png

В нормальном отображении такие цвета не видны, потому что alpha равна нулю. Поэтому визуально картинка обычно остается той же. Но это уже не строгое сохранение всех исходных данных: если кто-то позже будет анализировать скрытые RGB-значения прозрачных пикселей, они изменятся.

Практический смысл параметра — улучшить сжатие изображений с прозрачностью. У интерфейсных PNG часто есть полностью прозрачные области, внутри которых редактор оставляет случайные или старые RGB-данные. Для отображения они не нужны, но Deflate вынужден их сжимать. Очистка таких данных делает поток регулярнее.

Перевод 16-bit в 8-bit

Параметр --lossy_8bit переводит 16-битные каналы в 8-битные:

zopflipng --lossy_8bit input.png output.png

Это уже более заметное изменение данных. Для обычных веб-иконок и скриншотов 16-bit глубина не нужна. Но если исходник действительно использует расширенную точность, перевод в 8-bit может быть нежелателен.

--lossy_8bit нужно воспринимать как осознанную команду уменьшения точности, а не как безопасный дефолт. Для стандартных UI-ассетов она может быть полезной, но в универсальный прогон всех PNG ее лучше не добавлять без проверки.

Быстрый режим -q

Параметр -q включает быстрый, но менее эффективный режим:

zopflipng -q input.png output.png

В реализации -q отключает использование Zopfli-компрессии и оставляет быстрый проход, полезный для предварительной оценки фильтров и цветовых типов. Это не режим максимального сжатия, а способ быстро проверить, есть ли вообще смысл в дальнейшей оптимизации.

Усиленное сжатие -m

Параметр -m включает более тщательное сжатие:

zopflipng -m input.png output.png

В коде программы -m увеличивает число итераций для малых и больших файлов в четыре раза. Поэтому такой режим логично использовать не для огромной папки без отбора, а для финального прохода по важным PNG.

Dry run через -d

Dry run нужен, когда нужно увидеть результат в консоли, но не записывать файл:

zopflipng -d input.png output.png

Такой запуск полезен для бенчмаркинга, тестирования параметров, сравнения фильтров и проверки, стоит ли перезаписывать файл. В конце dry run программа сообщает, что файлы не были записаны, потому что указан режим dry run.

Пакетная обработка через --prefix

Для нескольких файлов используется --prefix:

zopflipng --prefix=zopfli_ icon.png logo.png screenshot.png

Результат:

zopfli_icon.pngzopfli_logo.pngzopfli_screenshot.png

Если --prefix указан без значения, используется префикс zopfli_:

zopflipng --prefix *.png

При повторных запусках программа пропускает файлы, которые уже начинаются с заданного префикса, чтобы не создавать цепочки вроде zopfli_zopfli_zopfli_icon.png. Это делает --prefix удобным для многократного подбора параметров в одной папке.

Интерфейс: как выглядит работа с ZopfliPNG

У ZopfliPNG нет графического интерфейса. Нет главного окна, панели предпросмотра, кнопки Открыть, ползунка качества, окна сравнения до/после и drag-and-drop зоны. Программа работает через терминал.

Типовой интерфейс состоит из:

  • имени команды zopflipng;

  • одного или нескольких параметров;

  • входного PNG-файла;

  • выходного PNG-файла;

  • строк результата в консоли.

Минимальный синтаксис:

zopflipng [options] infile.png outfile.png

Синтаксис для пакетной обработки:

zopflipng [options] --prefix=[fileprefix] [files.png]...

Если запустить zopflipng без нужного количества аргументов, программа показывает справку и примеры использования. Справка содержит основные параметры: -m, --prefix, -y, --lossy_transparent, --lossy_8bit, -d, --always_zopflify, -q, --iterations, --filters, --keepchunks, --keepcolortype.

Первая оптимизация PNG-файла

Самый простой сценарий — взять один файл и создать рядом оптимизированную копию.

zopflipng input.png output.png

Практически это выглядит так:

  1. В папке проекта есть исходный файл input.png.

  2. Команда zopflipng input.png output.png создает новый PNG.

  3. Программа выводит в терминал исходный размер и размер результата.

  4. Если результат меньше, его можно использовать вместо исходника.

  5. Если результат не меньше, программа не ухудшает ситуацию и может сохранить оригинал.

Вывод программы строится вокруг понятных строк:

Optimizing input.pngInput size: ...Result size: ... Percentage of original: ...Result is smaller

Если результат получился больше, программа сообщает, что оригинал меньше, либо сохраняет исходный PNG. Это важная защита: zopflipng не обязан уменьшать любой файл, потому что некоторые PNG уже прошли сильную оптимизацию.

Базовая команда подходит для первого прохода:

zopflipng screenshot.png screenshot.optimized.png

Для проверки результата удобно сравнить размеры:

ls -lh screenshot.png screenshot.optimized.png

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

Перезапись исходного файла

ZopfliPNG может писать результат в тот же файл, если это удобно для пайплайна:

zopflipng -y input.png input.png

Параметр -y отключает вопрос о перезаписи. Это удобно в скриптах, но опасно при ручной работе без резервной копии. Без -y, если выходной файл уже существует, программа спрашивает:

File input.png exists, overwrite? (y/N)

Для автоматизации -y почти всегда нужен, потому что CI, make-скрипт или shell script не должен ждать ручного ввода. Для разовой проверки лучше использовать отдельное имя выходного файла:

zopflipng input.png input.zopfli.png

Усиленное сжатие через -m

Режим -m — первый параметр, который стоит попробовать после базовой команды:

zopflipng -m input.png output.png

Он делает компрессию тщательнее. Внутри программы это связано с увеличением числа итераций, поэтому время обработки растет. На маленьких PNG это может быть почти незаметно, а на крупных скриншотах или больших наборах ассетов разница становится существенной.

Когда использовать -m:

Ситуация Подходит ли -m
Одна важная иконка да
Финальный билд сайта да
Несколько десятков небольших ассетов да, если время приемлемо
Сотни больших PNG только после отбора
Быстрая локальная проверка обычно нет
Автоматическая обработка каждого скриншота сразу после создания часто слишком медленно

Команда для финального прохода по одному файлу:

zopflipng -m logo.png logo.optimized.png

Команда для перезаписи в скрипте:

zopflipng -m -y logo.png logo.png

Число итераций --iterations

Параметр --iterations задает число итераций сжатия:

zopflipng --iterations=50 input.png output.png

Больше итераций обычно означает медленнее и потенциально немного меньше размер. При этом выигрыш не растет линейно. Между --iterations=15 и --iterations=50 разница может быть заметной, а между --iterations=500 и еще более высоким числом — уже минимальной.

Примеры:

zopflipng --iterations=15 input.png output.png
zopflipng --iterations=50 input.png output.png
zopflipng --iterations=500 input.png output.png

Практическая логика такая:

Значение Когда использовать
5–15 обычная оптимизация и быстрые прогоны
30–50 финальная оптимизация важных PNG
100–500 единичные файлы, где важен каждый килобайт
больше 500 редкие эксперименты, чаще не окупается

Для пакетной обработки не стоит сразу ставить большое число итераций на всю папку. Разумнее сначала сделать обычный прогон, затем выбрать файлы, где выигрыш важен, и уже к ним применить усиленные параметры.

Фильтры PNG и параметр --filters

PNG-фильтры — одна из причин, почему два визуально одинаковых PNG могут иметь разный размер. Фильтр применяется к строкам изображения перед Deflate-сжатием. Он не портит картинку, но меняет данные так, чтобы сжатие работало эффективнее.

ZopfliPNG умеет пробовать разные стратегии. Если --filters не указан, программа сама выбирает наиболее вероятно подходящий вариант через быстрые проверки. Если --filters указан, она пробует заданные стратегии уже с медленным сжатием и оставляет лучший результат.

Хороший универсальный набор:

zopflipng --filters=0me input.png output.png

Здесь:

  • 0 — простой filter type 0;

  • m — minimum sum;

  • e — entropy.

Для очень тщательной обработки:

zopflipng --iterations=500 --filters=01234mepb input.png output.png

Такой запуск пробует все основные типы PNG-фильтров, predefined-стратегию и экспериментальный brute force. Он может быть чрезмерно медленным, зато подходит для ситуации, когда PNG уже оптимизирован другими инструментами, но нужно попробовать выжать еще немного.

Как выбирать --filters на практике

Для обычного проекта можно использовать три уровня:

Уровень Команда Смысл
Базовый zopflipng input.png output.png довериться автоматике
Усиленный zopflipng -m --filters=0me input.png output.png хороший баланс
Максимальный zopflipng --iterations=500 --filters=01234mepb input.png output.png медленный ручной режим

Не нужно считать --filters=01234mepb универсально лучшим вариантом для каждого случая. Он просто тщательнее, а значит дороже по времени.

Работа с метаданными и --keepchunks

Удаление ancillary chunks — одна из причин, почему ZopfliPNG хорошо подходит для веба. В интерфейсной графике часто не нужны текстовые комментарии, дата создания, служебные данные редактора или лишняя gamma-информация. Но есть случаи, где удаление chunks может изменить отображение.

Типичный риск — цвет. Если PNG содержит iCCP, sRGB, gAMA или cHRM, удаление этих блоков может повлиять на интерпретацию цвета в некоторых просмотрщиках. Для обычных иконок это часто несущественно, а для брендовой графики, UI-kit, скриншотов с точной цветопередачей или технических изображений — важно.

Примеры сохранения chunks:

zopflipng --keepchunks=gAMA,pHYs input.png output.png
zopflipng --keepchunks=cHRM,gAMA,iCCP,sRGB input.png output.png
zopflipng --keepchunks=cHRM,gAMA,iCCP,sRGB,pHYs input.png output.png

Что означают некоторые chunks:

Chunk Зачем может понадобиться
gAMA информация о гамме
cHRM chromaticity
iCCP ICC color profile
sRGB указание стандартного sRGB-представления
pHYs физический размер пикселя
tEXt текстовые данные
zTXt сжатые текстовые данные
iTXt international textual data

Сохранять все chunks на всякий случай не стоит. Это снижает смысл оптимизации. Но для изображений, где важна стабильная цветопередача, --keepchunks лучше настроить явно.

--lossy_transparent: когда включать

--lossy_transparent — один из самых полезных спорных параметров. Он не должен менять видимое изображение, потому что затрагивает RGB-цвета только там, где alpha равна нулю. Но с точки зрения данных это изменение.

Команда:

zopflipng --lossy_transparent input.png output.png

Когда параметр уместен:

  • прозрачные PNG-иконки;

  • UI-ассеты с пустыми прозрачными полями;

  • spritesheets с альфа-каналом;

  • изображения из графических редакторов, где за прозрачностью остались случайные цвета;

  • web assets, где важен только видимый результат.

Когда параметр лучше не использовать:

  • если PNG используется как технический контейнер данных;

  • если скрытые RGB-значения прозрачных пикселей нужны для дальнейшей обработки;

  • если файл потом будет редактироваться как исходник;

  • если pipeline рассчитывает на побайтовое сохранение невидимых данных.

Практичная команда для веб-ассетов:

zopflipng -m --lossy_transparent input.png output.png

Для иконок с прозрачностью она часто дает лучший результат, чем простое zopflipng input.png output.png.

--lossy_8bit: сильный, но не универсальный параметр

--lossy_8bit переводит изображение с 16 бит на канал в 8 бит на канал:

zopflipng --lossy_8bit input.png output.png

Для большинства веб-скриншотов, иконок и интерфейсных PNG 16-bit глубина не нужна. Но если исходник действительно использует расширенную точность, перевод в 8-bit может быть нежелателен.

Хорошее правило: если файл пришел из графического редактора как 16-bit PNG случайно, --lossy_8bit может быть оправдан. Если файл является результатом научной визуализации, цветокоррекции, медицинского экспорта, heightmap, normal map или другого технического процесса, параметр лучше не включать без отдельной проверки.

Комбинация для агрессивной оптимизации обычного веб-ассета:

zopflipng -m --lossy_transparent --lossy_8bit input.png output.png

Комбинация для осторожной оптимизации:

zopflipng -m --keepchunks=cHRM,gAMA,iCCP,sRGB input.png output.png

--keepcolortype: зачем сохранять исходный color type

По умолчанию ZopfliPNG может изменить color type, если это помогает уменьшить размер без видимого изменения. Это полезно для compression ratio, но иногда нужно сохранить исходные технические свойства файла.

Команда:

zopflipng --keepcolortype input.png output.png

Этот параметр уместен, когда:

  • изображение используется в специфическом движке;

  • downstream-инструмент ожидает конкретный PNG color type;

  • файл входит в набор тестовых данных;

  • нужна стабильная структура PNG;

  • нельзя переводить RGBA в grayscale + alpha даже при визуальной идентичности.

Минус очевиден: меньше возможностей для оптимизации. Если в файле был избыточный цветовой тип, ZopfliPNG не сможет его упростить.

Пакетная оптимизация PNG

Для обработки нескольких PNG не нужно писать отдельную команду на каждый файл. Используется --prefix:

zopflipng --prefix=optimized_ *.png

Если в папке есть:

icon.pnglogo.pngscreen.png

после запуска появятся:

optimized_icon.pngoptimized_logo.pngoptimized_screen.png

Если префикс не указан явно:

zopflipng --prefix *.png

программа использует zopfli_:

zopfli_icon.pngzopfli_logo.pngzopfli_screen.png

Пакетный режим удобен для сравнения параметров. Например, можно сделать первый прогон:

zopflipng --prefix=base_ *.png

затем усиленный:

zopflipng -m --prefix=more_ *.png

и затем максимальный для выбранных файлов:

zopflipng --iterations=500 --filters=01234mepb --prefix=max_ icon.png logo.png

После этого можно сравнить размеры:

ls -lh *.png

Для массового запуска в реальном проекте обычно удобнее не оставлять копии с префиксом, а перезаписывать файлы после резервного копирования или внутри сборочной папки. Но для ручного тестирования --prefix безопаснее: исходники остаются нетронутыми.

Использование ZopfliPNG в автоматизации скриншотов

ZopfliPNG хорошо встраивается в автоматическую обработку скриншотов. Типичная цепочка выглядит так: скриншот сохраняется в папку, затем скрипт прогоняет его через pngquant для уменьшения палитры, а после этого через zopflipng для дополнительной Deflate-оптимизации. Такой сценарий часто используют для документации, README, issue-трекеров и технических блогов.

На скриншоте видно правило Hazel: оно обрабатывает PNG image, добавленные в папку Screenshots, и запускает shell script. В скрипте после pngquant вызывается zopflipng -y "$1" "$1", то есть файл оптимизируется с перезаписью. Такой подход удобен, когда скриншоты сразу должны становиться легче без ручного открытия оптимизатора.

Для Automator схема похожая: Folder Action получает новые файлы и передает их в Run Shell Script.

Пример shell script для Automator:

for f in "$@"do  /usr/local/bin/pngquant 64 --skip-if-larger --strip --ext=.png --force "$f"  /usr/local/bin/zopflipng -y "$f" "$f"done

В такой цепочке pngquant выполняет более агрессивное уменьшение за счет палитры, а zopflipng делает финальную переупаковку PNG. Это не строго lossless-пайплайн из-за pngquant, но для скриншотов интерфейсов результат часто выглядит приемлемо и весит существенно меньше. В сценарии без потерь pngquant нужно убрать и оставить только zopflipng.

Dry run и бенчмаркинг

Dry run через -d нужен для проверки без записи файла:

zopflipng -d input.png output.png

Такой запуск показывает размеры и результат, но не создает выходной файл. Это удобно при подборе параметров:

zopflipng -d --filters=0me input.png output.png
zopflipng -d --iterations=100 --filters=01234mepb input.png output.png
zopflipng -d --lossy_transparent input.png output.png

Бенчмаркинг нужно проводить на реальных изображениях проекта. Универсального лучшего набора параметров нет, потому что PNG-файлы сильно отличаются: скриншот интерфейса, пиксельная иконка, градиентная иллюстрация и экспорт из редактора с лишними chunks дают разный эффект.

Для сравнения можно использовать простую таблицу:

Прогон Команда Что смотреть
Базовый zopflipng -d input.png output.png общий потенциал
Усиленный zopflipng -d -m input.png output.png стоит ли включать -m
Фильтры zopflipng -d --filters=0me input.png output.png помогает ли ручной набор
Максимальный zopflipng -d --iterations=500 --filters=01234mepb input.png output.png предел для файла
Прозрачность zopflipng -d --lossy_transparent input.png output.png дает ли выигрыш alpha-очистка

Для пакетной проверки:

zopflipng -d --prefix=test_ *.png

В конце пакетного запуска программа показывает summary: сколько файлов обработано, сколько стали меньше, сколько сохранено, общий input size, output size и benchmark result size.

--always_zopflify: режим для тестов, не для обычной оптимизации

Параметр --always_zopflify заставляет программу выводить Zopfli-результат даже тогда, когда он больше оригинала:

zopflipng --always_zopflify input.png output.png

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

Для реальной подготовки ассетов лучше использовать стандартное поведение или -y для перезаписи только в контролируемой среде:

zopflipng -y input.png input.png

Практические сценарии использования

Оптимизация PNG для сайта

Для статического сайта часто достаточно такого процесса:

zopflipng -m assets/logo.png assets/logo.pngzopflipng -m assets/icon-menu.png assets/icon-menu.pngzopflipng -m assets/icon-close.png assets/icon-close.png

Если важна прозрачность:

zopflipng -m --lossy_transparent assets/icon-menu.png assets/icon-menu.png

Для папки:

find assets -name "*.png" -print0 | while IFS= read -r -d '' f; do  zopflipng -m -y "$f" "$f"done

Такой сценарий хорошо подходит для production-сборки, но не всегда удобен в dev-режиме. Во время разработки важнее скорость, поэтому zopflipng лучше запускать в финальном шаге.

Подготовка ассетов перед коммитом

В проекте можно выделить отдельную команду:

find public/images -name "*.png" -print0 | while IFS= read -r -d '' f; do  zopflipng -y "$f" "$f"done

Для более сильного прохода:

find public/images -name "*.png" -print0 | while IFS= read -r -d '' f; do  zopflipng -m --lossy_transparent -y "$f" "$f"done

Перед коммитом полезно смотреть diff не только по размеру, но и визуально. PNG может остаться тем же на вид, но если удалены chunks цветового профиля, отображение в конкретной среде иногда меняется.

Обработка скриншотов документации

Для документации обычно важны:

  • четкий текст;

  • сохранение прозрачности, если она есть;

  • небольшой размер;

  • стабильное отображение в браузере и markdown-просмотрщике.

Команда для одного скриншота:

zopflipng -m docs/screenshots/settings.png docs/screenshots/settings.png

Если скриншотов много:

zopflipng -m --prefix=optimized_ docs/screenshots/*.png

Для автоматического пайплайна с перезаписью:

for f in docs/screenshots/*.png; do  zopflipng -m -y "$f" "$f"done

Использование вместе с pngquant

pngquant и zopflipng часто комбинируют, но нужно понимать разницу. pngquant уменьшает PNG с потерями через палитру и 8-bit представление, а zopflipng потом сильнее упаковывает полученный PNG. pngquant относится к lossy PNG compressor и может сильно уменьшать размер файла.

Пайплайн:

pngquant 64 --skip-if-larger --strip --ext=.png --force screenshot.pngzopflipng -y screenshot.png screenshot.png

Для скриншотов это часто эффективно. Для иконок с фирменными цветами нужно проверять палитру, чтобы не получить заметные цветовые отличия.

Использование в npm scripts

В frontend-проекте можно завести скрипт:

{  "scripts": {    "optimize:png": "find public -name "*.png" -print0 | xargs -0 -I{} zopflipng -m -y {} {}"  }}

Для безопасного прогона с копиями:

{  "scripts": {    "optimize:png:test": "zopflipng -m --prefix=zopfli_ public/images/*.png"  }}

Такой подход полезен для статических сайтов, документации, дизайн-систем и библиотек компонентов.

Использование в Makefile

Пример цели:

optimize-png:	find public/images -name "*.png" -print0 | while IFS= read -r -d '' f; do 		zopflipng -m -y "$$f" "$$f"; 	done

Для осторожного режима:

optimize-png-preview:	zopflipng -m --prefix=zopfli_ public/images/*.png

Makefile удобен тем, что команда становится частью привычного процесса сборки:

make optimize-png

Использование в CI

В CI zopflipng можно запускать на этапе проверки ассетов. Есть два подхода:

  1. Оптимизировать и публиковать результат как build artifact.

  2. Проверять, что PNG уже оптимизированы, и падать, если можно уменьшить размер.

Для второго подхода удобно использовать dry run и отдельный скрипт, который сравнивает размеры. Но чаще zopflipng применяют проще: оптимизируют файлы в build-директории, а исходники в репозитории не меняют.

Производительность и нагрузка на CPU

ZopfliPNG медленный по своей природе. Он выигрывает размером за счет более тщательного поиска вариантов Deflate-представления и фильтрации. Для одного небольшого PNG задержка может быть приемлемой, но для сотен изображений нагрузка быстро становится заметной.

На скриншоте видно несколько процессов zopflipng, каждый из которых активно использует CPU. Это нормальная картина для тяжелой пакетной оптимизации: программа интенсивно считает, а не просто быстро переписывает файл. В таком режиме стоит ограничивать параллельность, особенно на ноутбуках и рабочих станциях, где одновременно запущены другие задачи.

Практические рекомендации:

Ситуация Режим
Быстро проверить один файл -q или обычный запуск
Финально сжать один важный файл -m
Найти максимум для одного файла --iterations=500 --filters=01234mepb
Обработать много ассетов обычный запуск или -m с ограничением параллельности
Автоматически сжимать скриншоты осторожно, без экстремальных итераций
Запустить в CI лучше на build-директории, а не на исходниках без контроля

Если нужно обрабатывать много файлов, не запускайте десятки zopflipng параллельно без необходимости. Лучше ограничить количество процессов:

find assets -name "*.png" -print0 | xargs -0 -n 1 -P 2 -I{} zopflipng -m -y {} {}

Здесь -P 2 ограничивает параллельность двумя процессами.

Качество результата: что проверять после оптимизации

ZopfliPNG часто дает визуально тот же PNG, но проверка все равно нужна. Особенно если используются параметры --lossy_transparent, --lossy_8bit или удаляются chunks.

Проверять нужно не абстрактно, а по конкретным пунктам.

Чек-лист проверки

Что проверить Почему важно
Размер файла оптимизация должна иметь смысл
Визуальное совпадение особенно для UI и брендовой графики
Прозрачность alpha-канал должен отображаться корректно
Цвета удаление iCCP, gAMA, sRGB может влиять на вид
Тонкие линии на схемах и иконках артефакты заметнее
Текст на скриншотах должен оставаться читаемым
Физический размер если важен pHYs
Палитра если применялся внешний lossy-инструмент
Отображение в браузере именно целевая среда важнее просмотрщика
Поведение в приложении если PNG используется не на вебе

Для строгой проверки можно сравнить изображения через инструменты pixel diff. Для обычной веб-графики часто хватает визуального просмотра до и после, но при массовой обработке лучше автоматизировать сравнение.

История версий программы

История ZopfliPNG связана с развитием Zopfli как алгоритма плотного Deflate-сжатия. Zopfli появился как инструмент для случаев, где медленное кодирование приемлемо ради меньшего размера статических данных. PNG оказался естественной областью применения, потому что в PNG используется Deflate.

Ключевые этапы:

Период Что произошло
Февраль 2013 появился первый reference implementation Zopfli
Апрель 2013 вышел Zopfli 1.0.0
Май 2013 ZopfliPNG вошел в репозиторий Google Zopfli
2013–2019 развивались сборка, параметры, исправления и упаковка
Ноябрь 2019 опубликован релиз 1.0.3
Последующие годы zopflipng продолжил использоваться как CLI-инструмент и как часть других оптимизационных workflow

ZopfliPNG изначально воспринимался как alpha-release для тестирования и обратной связи. Это объясняет характер программы: она не превращалась в массовый GUI-редактор, а оставалась технической утилитой для людей, которым важны конкретные параметры сжатия, повторяемость и контроль над PNG. В справке man-страницы zopflipng фигурирует дата November 2019 и обозначение zopflipng 1.0.3.

Сравнение с аналогами

ZopfliPNG нужно сравнивать не с графическими редакторами, а с инструментами PNG-оптимизации и сжатия изображений. У каждого аналога своя зона применения: одни быстрее, другие удобнее, третьи уменьшают файл сильнее за счет потерь.

Программа Тип Сильная сторона Ограничение
Oxipng lossless PNG/APNG optimizer быстрый многопоточный CLI, удобен для массовой обработки не всегда дает минимальный размер на единичном файле
OptiPNG lossless PNG optimizer классический надежный инструмент для recompress PNG часто менее агрессивен по итоговому размеру
pngquant lossy PNG compressor резко уменьшает PNG через палитру и 8-bit меняет изображение с потерями
pngcrush command-line PNG optimizer много режимов, brute-force подходы, работа с chunks старомодный CLI, подбор параметров может быть медленным
ImageOptim GUI для macOS удобно перетаскивать файлы, объединяет несколько оптимизаторов меньше контроля над конкретным запуском zopflipng
Squoosh web app для сжатия изображений визуальное сравнение, разные кодеки, работа в браузере хуже подходит для строгой автоматизации в shell-пайплайне

Oxipng

Oxipng — практичный выбор для массовой lossless-оптимизации PNG/APNG. Он написан с расчетом на скорость и многопоточность, поэтому часто лучше подходит для больших папок. Для проекта с сотнями PNG его проще использовать как основной быстрый оптимизатор. Oxipng относится к multithreaded lossless PNG/APNG compression optimizer.

Где Oxipng удобнее:

  • массовая обработка;

  • быстрые CI-задачи;

  • рекурсивная оптимизация папок;

  • APNG;

  • регулярные прогоны на большом количестве файлов.

Где ZopfliPNG сильнее:

  • финальная точечная оптимизация;

  • ручной подбор --filters;

  • высокая плотность Deflate для отдельных PNG;

  • простая предсказуемая команда без лишних уровней.

OptiPNG

OptiPNG — классический lossless PNG optimizer. Он хорошо подходит для безопасной переупаковки PNG без потери качества. Его часто используют там, где важна совместимость и умеренная скорость.

Типовая команда:

optipng input.png

OptiPNG удобен как базовый инструмент, но zopflipng чаще выбирают, когда хочется попробовать более плотное Deflate-сжатие и пользователь готов ждать дольше.

pngquant

pngquant — другой тип инструмента. Он не просто переупаковывает PNG, а уменьшает файл за счет lossy-преобразования в более компактный 8-bit PNG с alpha transparency. Поэтому pngquant может дать намного больший выигрыш, чем lossless-инструменты, но цена — изменение данных изображения.

Типовая команда:

pngquant 64 --skip-if-larger --strip --ext=.png --force input.png

После pngquant можно запустить:

zopflipng -y input.png input.png

Это хорошая цепочка для скриншотов, но не для случаев, где нужно строго сохранить каждый пиксель.

pngcrush

pngcrush — консольный PNG-оптимизатор, который может пробовать разные комбинации фильтров и compression methods. Он умеет как оптимизировать, так и модифицировать PNG. Для сильного перебора используют режимы вроде -brute.

Пример:

pngcrush -rem allb -brute -reduce input.png output.png

pngcrush полезен для тонких PNG-экспериментов, но его workflow менее прямолинеен. zopflipng проще воспринимается как финальный Deflate-оптимизатор.

ImageOptim

ImageOptim — удобная GUI-программа для macOS, объединяющая несколько оптимизаторов, включая Google Zopfli. Ее сильная сторона — простота: можно перетащить файлы в окно и получить оптимизированные изображения.

ImageOptim лучше для:

  • ручной работы дизайнеров;

  • быстрой оптимизации без терминала;

  • смешанных наборов JPEG, PNG, GIF, SVG;

  • пользователей macOS, которым не нужны shell scripts.

ZopfliPNG лучше для:

  • автоматизации;

  • повторяемых команд;

  • CI;

  • точного контроля параметров;

  • сравнения --iterations, --filters, --keepchunks.

Squoosh

Squoosh — браузерное приложение для сжатия и сравнения изображений с разными кодеками. Оно удобно, когда нужно визуально сравнить качество и размер, попробовать WebP/AVIF, изменить параметры и посмотреть результат сразу в браузере. Squoosh выполняет обработку локально в браузере и не отправляет изображение на сервер.

Squoosh лучше для ручного визуального выбора формата. ZopfliPNG лучше для терминального пайплайна и стандартного PNG без перехода на другой формат.

Лучшие настройки для разных задач

Задача Команда Комментарий
Базовая оптимизация zopflipng input.png output.png первый проход без усложнений
Перезапись в скрипте zopflipng -y input.png input.png удобно для автоматизации
Усиленное сжатие zopflipng -m input.png output.png хороший режим для финального PNG
Быстрая проверка zopflipng -q input.png output.png быстрее, но хуже по сжатию
Dry run zopflipng -d input.png output.png проверка без записи
Сохранить gamma/DPI zopflipng --keepchunks=gAMA,pHYs input.png output.png полезно для специальных случаев
Сохранить цветовой профиль zopflipng --keepchunks=cHRM,gAMA,iCCP,sRGB input.png output.png аккуратнее для цветочувствительных файлов
Прозрачные web-иконки zopflipng -m --lossy_transparent input.png output.png часто эффективно
16-bit в 8-bit zopflipng --lossy_8bit input.png output.png только если снижение точности приемлемо
Сохранить color type zopflipng --keepcolortype input.png output.png меньше сжатие, больше технической стабильности
Пакетный тест zopflipng --prefix=zopfli_ *.png безопасные копии
Максимальный перебор zopflipng --iterations=500 --filters=01234mepb input.png output.png для единичных важных PNG

Типичные ошибки и проблемы

Файл не уменьшается

Это нормально. PNG мог быть уже хорошо оптимизирован. Также файл может содержать данные, которые плохо поддаются дополнительному Deflate-сжатию. ZopfliPNG не гарантирует уменьшение каждого PNG.

Что делать:

zopflipng -d input.png output.pngzopflipng -d -m input.png output.pngzopflipng -d --filters=0me input.png output.png

Если разницы почти нет, файл уже близок к пределу для PNG.

Результат больше оригинала

Программа умеет сохранять оригинал, если новый результат больше. Для обычной оптимизации не используйте --always_zopflify, потому что он отключает здравую защиту.

Плохо для реальной оптимизации:

zopflipng --always_zopflify input.png output.png

Лучше:

zopflipng input.png output.png

Изменился цвет

Частая причина — удаление chunks, связанных с цветом. Для таких файлов используйте:

zopflipng --keepchunks=cHRM,gAMA,iCCP,sRGB input.png output.png

После этого сравните размер. Иногда сохранение цветовых chunks увеличивает файл, но это приемлемая цена за стабильное отображение.

Пропал DPI или физический размер

Для сохранения physical pixel dimensions нужен pHYs:

zopflipng --keepchunks=pHYs input.png output.png

Если одновременно важна гамма:

zopflipng --keepchunks=gAMA,pHYs input.png output.png

Программа работает слишком долго

Снизьте агрессивность:

zopflipng input.png output.png

Вместо:

zopflipng --iterations=500 --filters=01234mepb input.png output.png

Для массовой обработки ограничьте параллельность и не используйте экстремальные параметры без отбора.

Перезаписан исходник

-y input.png input.png удобно, но рискованно. Для ручной работы сначала используйте отдельный выходной файл:

zopflipng input.png input.optimized.png

Или пакетный префикс:

zopflipng --prefix=zopfli_ *.png

--lossy_8bit ухудшил технический файл

Не применяйте --lossy_8bit к файлам, где важна 16-bit точность. Для обычной lossless-оптимизации этот параметр не нужен.

--lossy_transparent оказался нежелательным

Если PNG используется как исходник для дальнейшей обработки, скрытые цвета прозрачных пикселей могут быть важны. В таком случае не используйте:

--lossy_transparent

Оставьте обычный режим:

zopflipng -m input.png output.png

Плюсы ZopfliPNG

  • Сильная Deflate-оптимизация PNG.

  • Стандартный выходной PNG без смены формата.

  • Хорошо подходит для web assets.

  • Удобен в shell scripts, Makefile, CI/CD и npm scripts.

  • Есть контроль --iterations, --filters, --keepchunks.

  • Есть безопасное поведение, когда результат не меньше исходника.

  • Можно использовать dry run для проверки без записи.

  • Хорошо работает как финальный этап после других PNG-инструментов.

  • Подходит для прозрачных PNG-иконок и скриншотов интерфейса.

  • Не требует графического окружения.

Минусы ZopfliPNG

  • Медленнее многих PNG-оптимизаторов.

  • Нет GUI, предпросмотра и drag-and-drop.

  • Не подходит для удобной ручной работы без терминала.

  • Выигрыш на уже оптимизированных PNG может быть минимальным.

  • Удаление chunks по умолчанию требует проверки цветопередачи.

  • --lossy_8bit и --lossy_transparent нужно использовать осознанно.

  • Для фотографий PNG часто сам по себе не лучший формат.

  • Экстремальные параметры могут давать микроскопический выигрыш при большом расходе CPU.

Кому стоит использовать ZopfliPNG

ZopfliPNG стоит использовать тем, кто понимает, зачем ему нужен именно PNG и почему важен размер файла.

Программа хорошо подходит:

  • веб-разработчикам;

  • frontend-инженерам;

  • DevOps-инженерам;

  • техническим писателям;

  • авторам документации;

  • разработчикам дизайн-систем;

  • владельцам статических сайтов;

  • тем, кто хранит много PNG-ассетов в репозитории;

  • тем, кто автоматизирует обработку изображений;

  • тем, кто хочет получить компактный PNG без перехода на WebP/AVIF.

Лучший пользователь ZopfliPNG — человек, который не ждет от программы красивого окна, а хочет точную команду:

zopflipng -m --lossy_transparent -y icon.png icon.png

Кому лучше выбрать другой инструмент

Для массовой быстрой lossless-обработки проще выбрать Oxipng. Он удобнее, когда нужно быстро пройтись по большой папке и получить хороший результат без ручного подбора фильтров.

Для сильного уменьшения скриншотов и иллюстраций с допустимыми потерями лучше использовать pngquant. Он часто уменьшает размер намного сильнее, потому что меняет представление изображения.

Для ручной работы на macOS удобнее ImageOptim. Там не нужно помнить параметры, достаточно перетащить файлы в окно.

Для визуального сравнения разных форматов лучше Squoosh. Он показывает размер, качество, варианты кодеков и позволяет сразу сравнить результат.

Для старых или специфических PNG-пайплайнов может подойти pngcrush, особенно если нужен контроль над chunks и brute-force-подбором.

Практическая стратегия использования

Оптимальный подход — не превращать ZopfliPNG в единственный инструмент для всех изображений, а поставить его на правильное место в цепочке.

Для web assets

zopflipng -m --lossy_transparent -y assets/icon.png assets/icon.png

Для документации

zopflipng -m -y docs/screenshots/settings.png docs/screenshots/settings.png

Для цветочувствительных изображений

zopflipng -m --keepchunks=cHRM,gAMA,iCCP,sRGB input.png output.png

Для пакетной проверки

zopflipng -m --prefix=zopfli_ *.png

Для максимального сжатия одного файла

zopflipng --iterations=500 --filters=01234mepb --lossy_transparent input.png output.png

Для строгого lossless-подхода

zopflipng -m input.png output.png

Без --lossy_transparent и без --lossy_8bit.

Итоговая оценка

ZopfliPNG / zopflipng — не универсальная программа для всех изображений и не замена графическому редактору. Это специализированный консольный PNG optimizer, который делает одну работу: тщательно переупаковывает PNG-файлы, используя Zopfli Deflate compression, подбор PNG scanline filters, оптимизацию color type и удаление несущественных chunks.

Его главная сила — финальная оптимизация. Когда файл уже готов, формат PNG нужен сохранить, а скорость обработки не критична, zopflipng остается сильным инструментом. Он особенно полезен для статических ассетов, скриншотов документации, прозрачных иконок, интерфейсной графики и автоматизированных пайплайнов.

Главная слабость — скорость. ZopfliPNG не создан для мгновенной обработки огромных наборов файлов с экстремальными параметрами. Его нужно запускать там, где выигрыш в размере действительно важен, а не бездумно применять ко всем изображениям на каждом локальном сохранении.

Сильная практическая команда для большинства PNG-ассетов выглядит так:

zopflipng -m --lossy_transparent -y input.png input.png

Более осторожная lossless-команда:

zopflipng -m input.png output.png

А для файлов, где важна цветопередача:

zopflipng -m --keepchunks=cHRM,gAMA,iCCP,sRGB input.png output.png

ZopfliPNG хорош именно как точный инструмент: медленный, строгий, понятный, автоматизируемый и полезный там, где нужно получить компактный стандартный PNG без перехода на другой формат.