При поиске «сжатие PNG» лидеры говорят о «без потерь» и неизменном качестве, но степень сжатия сильно разнится — от 10% до 70%.
Разница не в магии алгоритмов, а в том, что они имеют в виду разные вещи.
Эта статья объясняет различия и предлагает инструменты под задачи.
Сначала разберёмся: два типа «без потерь»
Истинно без потерь: пиксели не меняются ни одного
PNG сам по себе формат без потерь. Его размер зависит от двух частей: как упорядочены пиксели и как используется сжатие Deflate, а также сколько метаданных вложено в файл.
Истинно без потерь работает только в этих двух областях:
- Меняем способ хранения, экономящий место. Например, если используется всего 200 цветов, переключаемся в палитровый режим; если нет полупрозрачности, убираем альфа-канал; для оттенков серого сохраняем как оттенки серого.
- Пробуем лучшие фильтры и параметры Deflate. Один и тот же пиксель, разный способ кодирования — размер может отличаться. При экспорте через дизайн-инструменты скорость часто ставится выше оптимизации.
- Убираем метаданные. Информация о софте, метки времени, текстовые комментарии, миниатюры и т.д.
Распакованная картинка после сжатия идентична исходной по каждому пикселю. Цена — небольшая экономия; она «выжимает» только ту воду, которая осталась из-за нестрогого кодирования.
«Кажется без потерь»: на самом деле квантование с потерями
Инструменты вроде TinyPNG или pngquant экономят больше, потому что делают другое: уменьшают количество цветов PNG до 256 (квантование) и добавляют дизеринг, чтобы разница была незаметна глазу.
Это с потерями: пиксели изменились. Для большинства веб-иконок и иллюстраций это работает хорошо и оправдано; но если вам нужно «строго неизменные пиксели» — например, для UI-сплайтов, совпадающих с макетом, для пиксель-перфекционизма или редактирования после — лучше не использовать их.
Самый простой способ проверить, правда ли инструмент без потерь: сравнить исходную и сжатую картинки через ImageMagick
compare -metric AE исходная.png сжатая.png null:
Вывод0означает, что ни один пиксель не изменился.
Рекомендации по инструментам для PNG без потерь
Командная строка: oxipng (рекомендуется)
oxipng — оптимизатор PNG без потерь на Rust, по сути современная замена классическому OptiPNG:
- Многопоточность, высокая скорость, удобно для пакетной обработки.
- Параметры
-o 0до-o 6(а также-o max) — чем выше, тем медленнее, но экономия больше. - Опция
--zopfliдаёт дополнительное сжатие, но сильно замедляет процесс. - Сжатие PNG без потерь в Squoosh работает именно на oxipng.
bash
brew install oxipng
oxipng -o 2 --strip safe -r ./images # рекурсивно обрабатывать директорию, убираем только не влияющие на отображение метаданные
Командная строка: zopflipng (максимальный размер)
Продукт Google, переработанный сжатие Deflate с помощью алгоритма Zopfli. Обычно сжимает ещё немного сильнее, чем oxipng по умолчанию, но работает заметно медленнее; большие файлы могут обрабатываться долго. Подходит для статических ресурсов, которые сжимаются один раз и используются долго — логотипы сайта, встроенные иконки приложений.
Командная строка: OptiPNG, pngcrush (классика)
Оба инструмента — проверенные PNG-оптимизаторы без потерь, встречаются во многих сборках. Функционально почти полностью перекрыты oxipng, в новых проектах выбирать их нет смысла.
Веб: Squoosh
Онлайн-инструмент от Google. Для PNG без потерь выберите кодировщик OxiPNG (не отмечайте «Reduce palette», это с потерями).
Плюсы — не нужно устанавливать, можно сравнивать слева направо. Минус — одновременно только один файл, после скачивания его нужно переименовать и заменить вручную. Подходит для редкой обработки пары картинок.
Mac GUI: ImageOptim
Классический бесплатный инструмент для Mac с открытым кодом. Внутри интегрирован ряд оптимизаторов, включая oxipng, Zopfli, pngcrush — они по очереди пробуют найти самый маленький результат. По умолчанию без потерь (опция с потерями включается вручную).
Сильно сжимает, но при максимальной нагрузке на все оптимизаторы скорость невысока. Также файлы перезаписываются напрямую — перед сжатием лучше сделать резервную копию.
Mac GUI: ImgZilla
ImgZilla — инструмент для сжатия изображений на macOS, который мы делаем. Он обрабатывает PNG очень просто:
- Использует oxipng для истинно без потерь, уровень сжатия 2 (как и у Squoosh по умолчанию), балансируя скорость и размер. Пиксели не меняются — результат можно проверить командой
compare. - Не делает квантование, не уменьшает палитру, не меняет формат и размер. После сжатия PNG остаётся PNG.
- Сжатие на месте: имя и путь файла не меняются, ссылки в коде и документации не требуют обновления.
- Просто перетащить папку: рекурсивный поиск подкаталогов, автоматическое пропуска скрытых файлов и
node_modules. Обрабатывает JPG, GIF, WebP, HEIC, AVIF, SVG. - Исходники по умолчанию уходят в корзину, если не понравилось — правый клик и «вернуть».
- Не принудительно сжимает слабые файлы: если экономия менее 0,4%, файл помечается как «минимальный», оригинал сохраняется, бесплатный лимит не тратится.
- Всё работает локально: ваши файлы никуда не выгружаются на сервер.
Два момента:
- Не стремится к предельному размеру PNG. Уровень 2 намного быстрее
-o maxи Zopfli, но может экономить меньше процентов. Если вам нужно «сжать логотип до последнего байта», лучше zopflipng или ImageOptim. - По умолчанию удаляет все метаданные PNG, включая цветовой профиль. Обычным sRGB картинкам это не мешает; но если в изображении встроен широкий цветовой профиль (например, Display P3 — часто встречается в macOS-скриншотах и экспорте из дизайн-софта), после удаления цвета в софте для цветокоррекции могут немного измениться. Для строго цветных изображений включите «Сохранять EXIF» в настройках — тогда метаданные останутся.
Таблица для быстрого сравнения
| Инструмент | Тип | Истинно без потерь | Пакетная обработка | Для кого |
|---|---|---|---|---|
| oxipng | Командная строка | ✅ | ✅ | Разработчики, CI/CD |
| zopflipng | Командная строка | ✅ | Требует скрипта | Максимальный размер, не важна скорость |
| OptiPNG / pngcrush | Командная строка | ✅ | ✅ | Старые проекты |
| Squoosh | Веб | ✅ (OxiPNG, без снижения палитры) | ❌ Один файл | Редкая обработка пары картинок |
| ImageOptim | Mac | ✅ (по умолчанию) | ✅ | Mac-пользователи, максимальное сжатие |
| ImgZilla | Mac | ✅ | ✅ Перетащить папку | Пакетно, без смены путей, с возвратом оригинала |
| TinyPNG / pngquant | Веб / Команда | ❌ Квантование с потерями | Зависит от версии | Готовы к уменьшению цвета, максимальное сжатие |
Как выбирать
- Только пиксели не меняются, готовы вводить команды: oxipng, включить в скрипт сборки, раз и навсегда.
- Идеально сжать один файл до предела: zopflipng.
- Графическая пакетная обработка на Mac: ImageOptim сильнее в сжатии; ImgZilla быстрее, оригиналы из корзины, плюс обрабатывает другие форматы.
- Можно немного пожертвовать качеством ради меньшего размера: TinyPNG / pngquant, но помните — это уже не без потерь.
Напоследок: сколько именно сэкономит без потерь, зависит от того, как изначально был экспортирован PNG. Файлы, экспортированные напрямую из дизайн-софта и не оптимизированные ранее, часто содержат много лишнего; оптимизированные PNG сильно сжать сложнее — когда инструмент пишет «уже минимальный», это значит, что файл уже хорошо сжат, а не то, что инструмент слабый.
ImgZilla пока поддерживает только macOS (версии 12.3 и выше), доступен в Mac App Store. Бесплатная версия — 10 файлов в день, лимит считается только за успешное сжатие. Перетащите папку с PNG, затем проверьте результат командой
compare.
