← Вернуться в блог

Рекомендации по сжатию PNG без потерь: различаем «истинно без потерь» и «кажется без потерь»

При поиске «сжатие PNG» лидеры говорят о «без потерь» и неизменном качестве, но степень сжатия сильно разнится — от 10% до 70%. Разница не в магии алгоритмов, а в том, что «без потерь» — это разные вещи. Эта статья объясняет различия и предлагает инструменты под задачи.

Поделиться

При поиске «сжатие 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.

Нужны изображения легче и быстрее?

Скачайте ImgZilla и сжимайте локально — изображения не покидают ваш Mac.