Pngcrush: консольная утилита для сжатия PNG

Pngcrush — узкоспециализированная программа для работы с PNG-файлами. Это не редактор изображений, не просмотрщик и не универсальный конвертер, а командная утилита, которая оптимизирует PNG за счёт повторного сжатия IDAT-данных, перебора PNG-фильтров, выбора параметров zlib и управления служебными блоками внутри файла. Главная задача Pngcrush — уменьшить размер PNG без изменения видимого изображения, когда речь идёт о стандартной lossless-оптимизации.

Скачать Pngcrush

Бесплатно
В реестре программного обеспечения РФ
Чистая установка

Новейшая версия для Windows и macOS. Удобный редактор с ИИ и профессиональными функциями.

⬇ Скачать ФотоМАСТЕР бесплатно

⬇ Скачать Pngcrush (Windows)

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

Pngcrush в терминале: запуск, вывод сведений о программе и перебор методов сжатия

У программы нет привычных кнопок вроде Open, Save, Compress или Export. Вся работа строится через команды: пользователь указывает входной файл, выходной файл и параметры обработки. Такой подход выглядит менее дружелюбно, чем графический интерфейс, зато даёт точность. Одну и ту же команду можно повторить на сотнях файлов, встроить в скрипт, добавить в сборочный процесс или использовать для диагностики проблемного PNG.

Базовая команда выглядит так:

pngcrush input.png output.png

Здесь input.png — исходный файл, а output.png — результат после оптимизации. Если программа находит более компактное представление данных, она записывает новый PNG. Если результат не становится меньше и не запрошены изменения chunks, Pngcrush не обязан создавать файл большего размера без явного указания на это поведение.

Краткая характеристика Pngcrush

ПараметрОписание
Тип программыконсольный PNG-оптимизатор
Основной форматPNG
Основная задачауменьшение размера IDAT-данных и всего PNG-файла
Интерфейскомандная строка
Подход к сжатиюlossless-оптимизация при стандартном recompress-сценарии
Дополнительные функцииудаление и добавление PNG chunks, работа с гаммой, прозрачностью, текстовыми chunks, pHYs, sRGB, iCCP
Пакетная обработкаесть, через -d, -e, wildcard-маски и shell/PowerShell-скрипты
Подходит длявеб-разработчиков, верстальщиков, сборщиков приложений, пользователей CLI, администраторов сайтов
Не подходит длявизуального редактирования изображений, JPEG/WebP/AVIF, ручной ретуши, улучшения качества картинки

Pngcrush работает с внутренней структурой PNG. Файл PNG состоит не только из пикселей: внутри него есть chunks — блоки данных. Главные данные изображения находятся в одном или нескольких IDAT chunks. Кроме них могут быть дополнительные блоки: gAMA, tRNS, iCCP, sRGB, pHYs, tEXt, zTXt, iTXt и другие. Pngcrush умеет не только заново сжимать IDAT, но и изменять набор этих служебных блоков.

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

Для чего нужен Pngcrush на практике

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

Основные задачи, которые реально выполняются в Pngcrush:

  • оптимизация одного PNG-файла;

  • пакетная оптимизация папки с PNG;

  • перебор большого количества методов сжатия через -brute;

  • уменьшение битности или цветового типа через -reduce;

  • удаление лишних ancillary chunks через -rem;

  • сохранение или удаление отдельных chunks;

  • добавление текстовых chunks через -text, -ztxt, -itxt;

  • запись физического разрешения через -res;

  • работа с gamma-данными через -g и -replace_gamma;

  • добавление sRGB rendering intent через -srgb;

  • попытка обработки PNG с ошибками через -fix;

  • диагностика файла без создания результата через -n;

  • перезапись файла на месте через -ow.

Pngcrush не делает магии. Если исходный PNG уже прошёл сильную оптимизацию, выигрыш может быть нулевым или очень маленьким. Если изображение изначально сохранено неудачно, содержит лишние chunks, неоптимальную фильтрацию или тяжёлую структуру IDAT, программа может заметно уменьшить размер. Поэтому корректнее воспринимать Pngcrush как инструмент точной recompress-обработки, а не как гарантированный способ сжать любой PNG на 70%.

Интерфейс программы: командная строка вместо окон и кнопок

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

Справка Pngcrush в Windows Command Prompt со списком параметров командной строки

В графической программе пользователь обычно открывает изображение через меню File → Open, выбирает настройки и нажимает Save. В Pngcrush эти действия выглядят иначе:

pngcrush source.png optimized.png

Это аналог действия открыть source.png, применить оптимизацию, сохранить как optimized.png. Если нужно применить более глубокую оптимизацию, добавляется параметр:

pngcrush -brute source.png optimized.png

Если нужно обработать все PNG в папке и сложить результат в отдельный каталог, используется -d:

pngcrush -d optimized *.png

Если нужно удалить лишние chunks, команда становится более точной:

pngcrush -rem allb source.png optimized.png

Такой интерфейс неудобен для пользователя, который привык к кнопкам. Но он удобен для автоматизации: одна команда описывает задачу полностью. Её можно сохранить в .bat, .cmd, .sh, Makefile, npm-script, CI-сценарий или внутренний пайплайн подготовки изображений.

Как Pngcrush уменьшает размер PNG

PNG хранит пиксельные данные в IDAT chunks. Перед сжатием строки изображения могут проходить через фильтры. Эти фильтры не меняют картинку визуально, а преобразуют байты так, чтобы zlib-сжатие нашло больше повторов и закономерностей. Pngcrush перебирает разные сочетания фильтрации и параметров zlib, сравнивает размер получившегося IDAT-потока и выбирает наиболее компактный результат.

Pngcrush в xterm: пример обработки PNG и вывода результата с процентом уменьшения

Важный момент: обычная оптимизация Pngcrush не ухудшает изображение. Это не quality 80%, не JPEG-подобное сжатие и не замыливание картинки. Программа не перерисовывает изображение, не удаляет видимые детали, не меняет разрешение и не выполняет ретушь. Она заново упаковывает PNG-данные.

Внутри команды можно встретить такие обозначения:

Обозначение в выводеЧто означает
IDATосновные сжатые данные изображения
methodметод Pngcrush, то есть комбинация параметров
wswindow size, окно сжатия
fmfilter method
zlzlib compression level
zszlib strategy
Best pngcrush methodметод, который дал лучший результат
critical chunk reductionуменьшение критических данных
filesize reductionуменьшение размера файла
CPU timeвремя обработки

Пример типичного вывода:

Recompressing IDAT chunks in input.png to output.pngTotal length of data found in critical chunks = 4926Critical chunk length, method 1  = 5151Critical chunk length, method 6  = 4717Critical chunk length, method 10 = 4654Best pngcrush method = 10(5.52% critical chunk reduction)(5.64% filesize reduction)

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

Базовый синтаксис Pngcrush

У Pngcrush есть три основных формы запуска:

pngcrush [options] infile.png outfile.png
pngcrush -e ext [options] file1.png file2.png ...
pngcrush -d dir [options] file1.png file2.png ...

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

Самый безопасный первый запуск:

pngcrush input.png output.png

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

Более тщательный запуск:

pngcrush -brute input.png output.png

Вариант с попыткой уменьшить битность и цветовой тип:

pngcrush -reduce input.png output.png

Вариант с удалением части вспомогательных блоков:

pngcrush -rem allb input.png output.png

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

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

Эту команду нельзя считать универсально правильной для всех PNG. Она подходит для веб-ассетов, где важен размер, но может быть нежелательной для изображений, где важны цветовые профили, gamma-информация, авторские текстовые chunks или другие служебные данные.

Простая оптимизация одного PNG

Для обычной оптимизации достаточно указать входной и выходной файл:

pngcrush logo.png logo-optimized.png

После выполнения Pngcrush анализирует исходный PNG, пробует набор методов, выводит результат и записывает новый файл. Пользователь получает оптимизированную копию, а оригинал остаётся нетронутым.

Такой сценарий подходит для проверки конкретного изображения перед массовой обработкой. Например, есть файл header-icon.png, который используется на сайте. Сначала стоит выполнить:

pngcrush header-icon.png header-icon.crushed.png

Затем сравнить размер:

ls -lh header-icon.png header-icon.crushed.png

На Windows аналогично можно использовать:

dir header-icon.png, header-icon.crushed.png

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

Пакетная обработка PNG-файлов

Одна из сильных сторон Pngcrush — пакетная обработка. Если в каталоге лежат десятки или сотни PNG-файлов, вручную указывать каждому выходное имя неудобно. Для этого используется параметр -d, который задаёт папку вывода:

pngcrush -d optimized *.png

Эта команда берёт все PNG из текущего каталога и записывает оптимизированные версии в папку optimized с теми же именами файлов. Параметр -d предназначен для указания директории, куда будут помещены выходные файлы.

Типовой рабочий порядок:

mkdir optimizedpngcrush -d optimized *.png

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

mkdir optimizedpngcrush -brute -reduce -d optimized *.png

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

mkdir optimizedpngcrush -brute -reduce -rem allb -d optimized *.png

На Windows в PowerShell можно использовать похожий подход, но wildcard-обработка зависит от окружения и способа запуска. Практичный вариант — пройтись по файлам циклом:

New-Item -ItemType Directory -Force optimizedGet-ChildItem *.png | ForEach-Object {    .pngcrush.exe $_.FullName ("optimized" + $_.Name)}

Если нужно добавить -brute и -reduce:

New-Item -ItemType Directory -Force optimizedGet-ChildItem *.png | ForEach-Object {    .pngcrush.exe -brute -reduce $_.FullName ("optimized" + $_.Name)}

Пакетная обработка особенно полезна для:

  • папки с иконками сайта;

  • набора PNG-скриншотов в статье;

  • ассетов приложения;

  • экспортированных изображений из редактора;

  • технических схем;

  • изображений интерфейса;

  • графики, которая попадает в сборку.

Перезапись исходных файлов через -ow

Параметр -ow включает overwrite-режим:

pngcrush -ow image.png

В этом режиме Pngcrush перезаписывает исходный файл. Это удобно, когда нужно быстро пройтись по каталогу и заменить PNG на оптимизированные версии. Но это рискованный режим: если команда составлена неверно, если удалены важные chunks или если результат нужно было сравнить с оригиналом, откатиться будет сложнее.

Безопасная схема:

  1. Сначала обработать файлы в отдельную папку через -d.

  2. Проверить размеры и внешний вид.

  3. Сравнить структуру PNG, если важны chunks.

  4. Только после этого использовать -ow в рабочем сценарии.

Пример осторожного подхода:

mkdir test-outputpngcrush -brute -reduce -d test-output *.png

И только после проверки:

pngcrush -brute -reduce -ow *.png

В автоматизации лучше использовать резервное копирование перед перезаписью. Pngcrush — точный инструмент, но он выполняет именно то, что указано в команде. Если пользователь добавил -rem text, текстовые chunks будут удалены. Если добавил -rem allb, структура файла изменится сильнее. Поэтому -ow стоит применять только к тем данным, которые можно восстановить.

Глубокая оптимизация через -brute

Параметр -brute включает более широкий перебор методов:

pngcrush -brute input.png output.png

Обычный режим использует разумный набор методов. -brute заставляет Pngcrush пробовать гораздо больше комбинаций фильтрации и сжатия. Это может дать меньший файл, но почти всегда увеличивает время обработки.

-brute полезен, когда:

  • PNG-файлов немного;

  • каждый килобайт важен;

  • изображения идут в публичный сайт или приложение;

  • обработка выполняется один раз перед релизом;

  • есть время на долгий перебор;

  • нужно получить максимально компактный lossless-результат средствами Pngcrush.

-brute не стоит включать бездумно, когда:

  • обрабатываются тысячи файлов;

  • пайплайн должен работать быстро;

  • изображения уже обработаны другим оптимизатором;

  • выигрыш меньше стоимости времени;

  • сборка запускается часто;

  • есть ограничение по CPU.

Пример с -brute и отдельным каталогом вывода:

mkdir crushedpngcrush -brute -d crushed *.png

Пример для одного файла:

pngcrush -brute screenshot.png screenshot.crushed.png

Если нужно ограничить перебор конкретным фильтром, используется -f:

pngcrush -brute -f 0 input.png output.png

Если нужно задать zlib compression level:

pngcrush -brute -l 9 input.png output.png

Если нужно задать zlib strategy:

pngcrush -brute -z 1 input.png output.png

Эти параметры уже относятся к тонкой настройке. В большинстве рабочих задач достаточно -brute, -reduce, -rem и аккуратного выбора вывода.

Уменьшение битности и цветового типа через -reduce

Параметр -reduce включает lossless-сокращение там, где оно возможно:

pngcrush -reduce input.png output.png

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

Пример:

pngcrush -reduce icon.png icon-reduced.png

Комбинация с более глубоким перебором:

pngcrush -brute -reduce icon.png icon-reduced.png

-reduce особенно полезен для:

  • простых иконок;

  • одноцветных или почти одноцветных элементов;

  • серых изображений;

  • PNG без реально используемого альфа-канала;

  • файлов, сохранённых редактором с избыточными параметрами;

  • технических схем и UI-элементов.

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

Удаление лишних chunks и метаданных

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

pngcrush -rem tEXt input.png output.png

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

pngcrush -rem tEXt -rem zTXt -rem iTXt input.png output.png

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

pngcrush -rem text input.png output.png

Pngcrush различает известные chunks и неизвестные chunks. Для известных chunks можно использовать нижний регистр, например -rem bkgd эквивалентно удалению bKGD. Для неизвестных chunks важен точный регистр. Это важно, потому что PNG chunk names чувствительны к регистру.

Есть и более широкие варианты:

pngcrush -rem alla input.png output.png
pngcrush -rem allb input.png output.png

-rem alla удаляет известные ancillary chunks, кроме tRNS. -rem allb удаляет всё, кроме tRNS и gAMA. Это грубые режимы, которые подходят не всегда. Их не стоит применять к файлам, где важна цветопередача, авторские сведения, профиль, физическое разрешение или текстовые данные.

Практический пример для веб-графики:

pngcrush -brute -reduce -rem allb banner.png banner.optimized.png

Более осторожный вариант:

pngcrush -brute -reduce -rem text banner.png banner.optimized.png

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

Работа с прозрачностью

PNG часто используют из-за прозрачности. Pngcrush умеет работать с tRNS chunk и альфа-каналом. Прозрачность может храниться по-разному: через отдельный tRNS chunk или через альфа-канал в цветовых типах 4 и 6. В описании цветовых типов PNG альфа-канал означает прозрачность на уровне пикселя: нулевое значение полностью прозрачно, максимальное — полностью непрозрачно.

Команда для добавления tRNS выглядит так:

pngcrush -trns index red green blue gray input.png output.png

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

pngcrush -trns_array n trns0 trns1 trns2 input.png output.png

На практике такие команды нужны не всем. Гораздо чаще пользователь сталкивается с другим параметром — -blacken:

pngcrush -blacken input.png output.png

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

-blacken уместен для:

  • веб-иконок;

  • UI-ассетов;

  • PNG с полностью прозрачными областями;

  • графики, где скрытые цвета прозрачных пикселей не имеют значения.

-blacken нежелателен для:

  • промежуточных файлов дизайна;

  • изображений, которые будут редактироваться дальше;

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

  • файлов, где важно сохранить исходные пиксельные данные полностью.

Работа с текстовыми chunks

Pngcrush умеет не только удалять текстовые chunks, но и добавлять их. PNG поддерживает несколько типов текстовой информации: tEXt, zTXt, iTXt. tEXt использует Latin-1, zTXt хранит сжатый текст, iTXt рассчитан на Unicode/UTF-8.

Добавление обычного tEXt chunk:

pngcrush -text b "Author" "Ivan Petrov" input.png output.png

Здесь:

  • -text — вставка tEXt chunk;

  • b — вставить before IDAT;

  • "Author" — ключ;

  • "Ivan Petrov" — значение;

  • input.png — исходный файл;

  • output.png — результат.

Вставка после IDAT:

pngcrush -text a "Comment" "Optimized for website" input.png output.png

Добавление iTXt:

pngcrush -itxt b "Description" "Interface icon for settings screen" input.png output.png

Добавление zTXt:

pngcrush -ztxt b "Comment" "Compressed metadata comment" input.png output.png

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

Gamma, sRGB и цветовые данные

Pngcrush умеет работать с gAMA и sRGB. Эти chunks относятся к интерпретации цвета. Ошибка многих пользователей — считать все ancillary chunks мусором. Это неверно: часть chunks действительно может быть лишней, но цветовые блоки иногда влияют на то, как изображение будет выглядеть в разных программах.

Добавление gamma, если gAMA отсутствует:

pngcrush -g 45455 input.png output.png

Замена существующего gamma-значения:

pngcrush -replace_gamma 45455 input.png output.png

Значение 45455 соответствует распространённой записи gamma около 1/2.2, потому что Pngcrush интерпретирует число как GAMMA×100000.

Установка sRGB rendering intent:

pngcrush -srgb 0 input.png output.png

Варианты -srgb:

ЗначениеНазначение
0perceptual
1relative colorimetric
2saturation
3absolute colorimetric

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

Запись разрешения через -res

Параметр -res записывает pHYs chunk с разрешением в dpi:

pngcrush -res 300 input.png output.png

pHYs chunk описывает желаемый физический размер пикселя. Для веба это обычно не критично: браузер чаще отображает изображение по пиксельным размерам или CSS-правилам. Для печати, документации и некоторых рабочих процессов pHYs может иметь значение.

Пример для изображения, которое нужно сохранить с разрешением 300 dpi:

pngcrush -res 300 diagram.png diagram-300dpi.png

Если PNG используется только как веб-иконка, pHYs часто можно удалить вместе с другими вспомогательными chunks. Но если файл идёт в печатный макет или техническую документацию, удаление pHYs может быть нежелательным.

Проверка и попытка исправления PNG через -fix

Параметр -fix нужен для случаев, когда PNG содержит ошибки, которые обычно считаются фатальными:

pngcrush -fix broken.png fixed.png

Он может помочь при проблемах вроде плохих CRC. CRC — контрольная сумма chunk, по которой декодер понимает, повреждены данные или нет. Pngcrush с -fix пытается обработать файл в более терпимом режиме.

Важно: -fix — не универсальный ремонт любых изображений. Он не восстанавливает потерянные пиксели из воздуха, не чинит любой битый файл и не превращает повреждённый мусор в нормальную картинку. Это режим для определённых ошибок структуры PNG, когда данные ещё можно прочитать или частично обработать.

Практический сценарий:

pngcrush -fix damaged.png repaired.png

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

Режим диагностики без записи файла: -n

Параметр -n отключает сжатие и запись выходного файла:

pngcrush -n input.png

Он используется для получения информации или проверки чтения файла. Особенно полезен вместе с -v:

pngcrush -n -v input.png

Повторный -v даёт ещё более подробный вывод:

pngcrush -n -v -v input.png

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

Управление подробностью вывода

У Pngcrush есть параметры, которые регулируют количество сообщений:

pngcrush -v input.png output.png
pngcrush -v -v input.png output.png
pngcrush -q input.png output.png

-v включает более подробный вывод. Повтор -v -v делает его ещё детальнее. -q включает тихий режим. В обычной работе подробный вывод полезен при диагностике, а тихий режим — в скриптах, где не нужно засорять лог.

Для проверки структуры:

pngcrush -n -v image.png

Для массовой обработки с минимальным шумом:

pngcrush -q -d optimized *.png

Для отладки конкретного файла:

pngcrush -v -v -brute image.png image.out.png

Настройка zlib-сжатия

Pngcrush позволяет управлять параметрами zlib. Самый понятный параметр — -l, compression level:

pngcrush -l 9 input.png output.png

Уровни zlib находятся в диапазоне от 0 до 9:

УровеньСмысл
0без сжатия
1быстрое сжатие
9максимальное сжатие

Есть также -z, который задаёт zlib strategy:

pngcrush -z 0 input.png output.png
pngcrush -z 1 input.png output.png
pngcrush -z 2 input.png output.png

Варианты стратегии:

ЗначениеОписание
0стандартная стратегия, ориентирована на string matching
1сочетание string matching и Huffman coding
2только Huffman coding

Эти параметры обычно используют не изолированно, а вместе с -m или -brute, когда нужно проверить конкретные комбинации. Pngcrush хорош именно тем, что может не просто поставить уровень 9, а сравнить несколько вариантов и выбрать лучший по размеру IDAT.

Методы Pngcrush и параметр -m

Параметр -m позволяет указать конкретный метод:

pngcrush -m 10 input.png output.png

Можно указать несколько методов:

pngcrush -m 1 -m 4 -m 7 input.png output.png

Метод — это заранее определённая или составная комбинация фильтра, zlib level и zlib strategy. В обычной работе пользователю редко нужно вручную подбирать -m. Чаще достаточно:

pngcrush input.png output.png

или:

pngcrush -brute input.png output.png

Но -m полезен, если:

  • известен метод, который стабильно хорошо работает на конкретном наборе изображений;

  • нужно воспроизвести результат;

  • нужно ограничить перебор;

  • нужно уменьшить время обработки;

  • нужно провести тест разных методов.

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

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

Параметр -f задаёт фильтр:

pngcrush -f 0 input.png output.png

Доступные типы:

ЗначениеФильтр
0none
1sub
2up
3average
4paeth
5adaptive

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

Сохранение неизвестных chunks через -save

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

pngcrush -save input.png output.png

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

Работа с MNG и параметр -mng

Pngcrush связан с набором PNG/MNG-инструментов и содержит параметры для MNG. Параметр -mng используется для записи нового MNG без crush embedded PNG:

pngcrush -mng input.mng output.mng

Для обычного пользователя, который оптимизирует PNG для сайта, этот режим почти не нужен. Но наличие -mng показывает происхождение инструмента: Pngcrush относится к низкоуровневой экосистеме PNG/MNG-утилит, а не к классу современных графических приложений с визуальным интерфейсом.

Типовые команды Pngcrush для рабочих задач

ЗадачаКомандаКомментарий
Оптимизировать один PNGpngcrush input.png output.pngбезопасный базовый запуск
Глубокая оптимизацияpngcrush -brute input.png output.pngмедленнее, но тщательнее
Попытка lossless-снижения битностиpngcrush -reduce input.png output.pngполезно для простых PNG
Оптимизация с удалением части chunkspngcrush -rem allb input.png output.pngприменять осознанно
Удалить текстовые chunkspngcrush -rem text input.png output.pngчасто подходит для веба
Пакетная обработка в каталогpngcrush -d optimized *.pngрезультат отдельно от оригиналов
Пакетная глубокая обработкаpngcrush -brute -reduce -d optimized *.pngудобно перед релизом
Перезаписать файлpngcrush -ow image.pngтолько после бэкапа
Диагностика без записиpngcrush -n -v image.pngпосмотреть сведения
Попытка исправленияpngcrush -fix broken.png fixed.pngне универсальный ремонт
Добавить комментарийpngcrush -text b "Comment" "Text" in.png out.pngвставка tEXt
Записать dpipngcrush -res 300 in.png out.pngдобавляет pHYs
Задать sRGB intentpngcrush -srgb 0 in.png out.pngработа с цветовой интерпретацией
Заменить gammapngcrush -replace_gamma 45455 in.png out.pngперезапись gAMA

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

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

Создать папку результата:

mkdir optimized

Сначала выполнить обычную обработку:

pngcrush -d optimized *.png

Если результат слабый, попробовать более глубокий вариант:

pngcrush -brute -reduce -d optimized *.png

Если нужно убрать текстовые chunks:

pngcrush -brute -reduce -rem text -d optimized *.png

Если речь о декоративной веб-графике, где не нужны почти все ancillary chunks, можно применить более жёсткий вариант:

pngcrush -brute -reduce -rem allb -d optimized *.png

После обработки нужно сравнить размеры:

du -h *.pngdu -h optimized/*.png

На Windows:

Get-ChildItem *.png | Select-Object Name, LengthGet-ChildItem optimized*.png | Select-Object Name, Length

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

Практический сценарий: очистка PNG от метаданных

Если PNG содержит текстовые комментарии, сведения об авторе или служебные подписи, их можно удалить:

pngcrush -rem text input.png output.png

Для удаления конкретного tEXt:

pngcrush -rem tEXt input.png output.png

Для удаления zTXt:

pngcrush -rem zTXt input.png output.png

Для удаления iTXt:

pngcrush -rem iTXt input.png output.png

Для более широкой очистки:

pngcrush -rem alla input.png output.png

или:

pngcrush -rem allb input.png output.png

Практически это выглядит так: дизайнер экспортировал PNG, редактор добавил текстовые chunks или служебную информацию. Для сайта эти данные не нужны. Команда -rem text убирает текст, а -brute -reduce дополнительно пытаются уменьшить файл.

pngcrush -brute -reduce -rem text hero.png hero.clean.png

Такой вариант аккуратнее, чем -rem allb, потому что не затрагивает широкий набор данных. Если нужно максимально облегчить декоративный файл, можно использовать более агрессивную команду, но после проверки:

pngcrush -brute -reduce -rem allb hero.png hero.clean.png

Практический сценарий: автоматизация в build-процессе

Pngcrush хорошо подходит для автоматизации, потому что его поведение описывается одной командой. Например, в проекте есть папка assets/png, а результат нужно класть в dist/png.

Shell-скрипт:

#!/bin/shmkdir -p dist/pngpngcrush -brute -reduce -rem text -d dist/png assets/png/*.png

PowerShell-скрипт:

New-Item -ItemType Directory -Force distpngGet-ChildItem assetspng*.png | ForEach-Object {    .pngcrush.exe -brute -reduce -rem text $_.FullName ("distpng" + $_.Name)}

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

Быстрый режим:

pngcrush -reduce -d dist/png assets/png/*.png

Релизный режим:

pngcrush -brute -reduce -rem text -d dist/png assets/png/*.png

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

Насколько хорошо Pngcrush сжимает PNG

Результат зависит от исходного файла. Pngcrush может уменьшить PNG заметно, а может почти ничего не изменить. Это нормально для lossless-оптимизации.

На результат влияют:

  • как исходный файл был сохранён;

  • какие PNG-фильтры использовались раньше;

  • есть ли лишние chunks;

  • содержит ли файл прозрачность;

  • есть ли избыточный альфа-канал;

  • можно ли снизить битность;

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

  • является ли изображение скриншотом, схемой, иконкой или фотографией;

  • проходил ли файл через другие оптимизаторы.

Лучше всего Pngcrush проявляет себя на:

  • PNG-иконках;

  • скриншотах интерфейса;

  • простых схемах;

  • графике с большими однотонными областями;

  • изображениях с неоптимальным экспортом;

  • файлах с лишними chunks.

Слабее эффект на:

  • уже оптимизированных PNG;

  • фотографиях, сохранённых в PNG;

  • сложных полноцветных изображениях;

  • файлах после Oxipng, ZopfliPNG или других сильных оптимизаторов;

  • PNG, где основная масса данных уже записана близко к оптимальному варианту.

Если фотография сохранена в PNG, Pngcrush может уменьшить её, но сам выбор формата часто неудачен. Для фотографий обычно уместнее JPEG, WebP или AVIF. Pngcrush не заменяет выбор правильного формата. Он оптимизирует PNG, но не превращает PNG в лучший формат для любой картинки.

История версий Pngcrush

Pngcrush развивался как утилита для точной работы с PNG-структурой. В ранней истории программа прошла путь от инструмента с регистрационным ограничением до открытой утилиты: в ветке 1.2.0 было удалено требование регистрации, добавлена open-source-лицензия и изменены параметры zlib TOO_FAR.

В ветке 1.3.x программа получила более зрелую работу с chunks. В 1.3.0 появилась поддержка неизвестных chunks, а в 1.3.1 были добавлены описания -itxt, -ztxt, -zitxt в справочный экран. Это важный этап, потому что Pngcrush стал не только пересжимателем IDAT, но и инструментом для управления дополнительными PNG-данными.

В версии 1.3.5 была восстановлена возможность удалять tEXt, zTXt и iTXt по типу chunk: например, -rem tEXt удаляет только tEXt, а -rem text удаляет все три формы текстовых chunks. Для практического использования это важно до сих пор: пользователь может удалить только конкретный тип метаданных или очистить все текстовые записи сразу.

В ветке 1.4.x развивалась обработка ошибок и совместимость с libpng. В 1.4.2 появилась обработка лишних IDAT chunks с предупреждением вместо немедленного отказа, а в 1.4.8 были добавлены определения полностью непрозрачного альфа-канала и преобразование полностью серых truecolor-изображений в grayscale.

В версии 1.5.0 была исправлена проблема, связанная с плохим Photoshop iCCP chunk, когда корректировка могла применяться не только к проблемному файлу, но и к последующим PNG в командной строке. Для пакетной обработки это особенно важно: ошибка одного файла не должна загрязнять обработку остальных.

В ветке 1.6.x программа получила изменения по совместимости, внутреннему устройству и работе с dSIG. В 1.6.6 появилась поддержка dSIG: Pngcrush не переписывает изображение с dSIG после IHDR, если пользователь явно не удаляет или не сохраняет этот chunk. Это пример того, что программа работает осторожно с данными, которые могут потерять смысл после изменения потока.

В ветке 1.7.x появились заметные рабочие функции. В 1.7.22 был добавлен -ow для перезаписи исходного файла. В 1.7.38 появился -blacken, который меняет цветовые значения полностью прозрачных пикселей на ноль для улучшения сжимаемости. В 1.7.49 была реализована логика -reduce для определения серых изображений, непрозрачных изображений, неиспользуемых PLTE entries и 16-битных файлов, которые можно losslessly уменьшить до 8 бит.

В 1.7.80 появились -reduce_palette и -noreduce_palette, а в 1.7.87 был исправлен double-free bug CVE-2015-7700. Это показывает, что история Pngcrush — не только про новые параметры, но и про исправления безопасности, совместимость с libpng/zlib и аккуратную обработку PNG-структуры.

В ветке 1.8.x важное изменение связано с поведением по умолчанию: в 1.8.0 -reduce и -force стали default behavior, а часть устаревших параметров была удалена. В 1.8.1 были изменены детали -force и добавлен -speed, который избегает AVG и PAETH filters ради скорости декодирования. В 1.8.5 появился -benchmark n, а в 1.8.12 изменилась verbosity-логика: обычная подробность была снижена, и для прежнего поведения требуется -v.

История версий Pngcrush хорошо показывает характер программы: это не инструмент с модным интерфейсом и маркетинговыми функциями, а инженерная CLI-утилита, в которой годами уточнялись обработка chunks, совместимость с libpng/zlib, безопасность, фильтрация, скорость и поведение при ошибках.

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

Pngcrush находится в одном классе с другими PNG-оптимизаторами, но у каждого инструмента своя логика. Прямое сравнение нужно делать не по принципу какой лучше вообще, а по задаче: максимальное lossless-сжатие, скорость, простота, пакетная обработка, работа с chunks, lossy-компрессия или удобный GUI.

ПрограммаТипСильные стороныОграничения
OptiPNGCLI PNG-оптимизаторпростая lossless-оптимизация, пересжатие PNG, конвертация некоторых внешних форматов в PNGменьше акцента на ручную хирургию chunks
OxipngCLI PNG/APNG-оптимизаторсовременный многопоточный lossless-подход, хорош для build-процессов и массовой обработкименьше исторической ориентации на ручную работу с отдельными chunks
pngquantCLI/library для PNGсильное уменьшение размера за счёт преобразования в 8-битный PNG с альфа-каналомэто lossy-подход, не строгая lossless-оптимизация
ZopfliPNG / zopflipngCLI PNG-оптимизаторсильное Deflate-сжатие через Zopfli, часто хороший финальный размерможет быть медленным
ImageOptimграфическая оболочка и набор оптимизаторовудобен для пользователей macOS, drag-and-drop, не требует знания командменьше прямого контроля над параметрами конкретного CLI-инструмента
TinyPNGонлайн-сервис/сжатие изображенийпростота, сильное уменьшение веса, удобно без терминалаlossy-подход и зависимость от внешнего сервиса

OptiPNG близок по назначению: это тоже PNG-оптимизатор, который пересжимает файл без потери информации и умеет выполнять проверки/исправления PNG. Он также может конвертировать BMP, GIF, PNM и TIFF в оптимизированный PNG.

Oxipng современнее по архитектуре: это многопоточный lossless PNG/APNG optimizer, написанный на Rust. Его часто выбирают для современных пайплайнов, где важна скорость на большом количестве файлов.

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

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

Pngcrush на фоне этих программ ценен не только как сжиматель, но и как инструмент управления PNG-структурой. Он удобен, когда нужно явно удалить tEXt, добавить gAMA, сохранить неизвестные chunks, выставить pHYs, попробовать -fix, провести диагностику через -n -v или воспроизвести конкретную комбинацию параметров.

Плюсы Pngcrush

Главное преимущество Pngcrush — точность. Программа не скрывает обработку за красивой кнопкой. Пользователь сам задаёт, что нужно сделать: просто пересжать IDAT, включить -brute, удалить текстовые chunks, сохранить неизвестные chunks, изменить gamma, записать dpi или перезаписать файл.

Плюсы:

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

  • подходит для скриптов и автоматизации;

  • оптимизирует PNG без потери видимого качества в стандартном recompress-сценарии;

  • умеет пакетно обрабатывать файлы;

  • позволяет управлять ancillary chunks;

  • поддерживает -brute для более глубокого перебора;

  • умеет диагностировать PNG без записи результата;

  • содержит режим -fix для некоторых проблемных файлов;

  • позволяет добавлять текстовые chunks;

  • даёт контроль над gamma, sRGB, pHYs, прозрачностью;

  • не требует графического интерфейса;

  • хорошо подходит для серверных и сборочных процессов.

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

Минусы Pngcrush

Главный минус — отсутствие графического интерфейса. Для пользователя, который не работает с командной строкой, Pngcrush будет выглядеть неудобно. Нужно понимать путь к файлу, кавычки, каталог вывода, wildcard-маски, параметры и последствия удаления chunks.

Минусы:

  • нет визуального интерфейса;

  • нет предпросмотра до и после;

  • нет кнопок для типовых сценариев;

  • нужно понимать командную строку;

  • -brute может работать долго;

  • результат не всегда лучше современных оптимизаторов;

  • не работает с JPEG, WebP, AVIF как универсальный конвертер;

  • не редактирует изображение визуально;

  • не улучшает качество исходника;

  • агрессивное удаление chunks может быть вредным;

  • перезапись через -ow опасна без копий.

Pngcrush не стоит рекомендовать как самый простой компрессор PNG для всех. Это инструмент для тех, кто понимает, зачем ему CLI и контроль над параметрами.

Кому подойдёт Pngcrush

Pngcrush подойдёт пользователю, которому важен контроль. Это может быть веб-разработчик, который готовит PNG-ассеты перед публикацией. Или администратор сайта, который периодически оптимизирует изображения. Или разработчик приложения, которому нужно обработать набор иконок перед сборкой. Или человек, который проверяет PNG-структуру и хочет удалить конкретные chunks.

Хорошие сценарии:

  • подготовка PNG для сайта;

  • оптимизация UI-графики;

  • обработка экспортов из графического редактора;

  • пакетное сжатие иконок;

  • очистка текстовых chunks;

  • диагностика PNG;

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

  • работа в Linux/Unix shell;

  • обработка на сервере;

  • подготовка ассетов перед релизом.

Pngcrush также полезен тем, кто хочет понимать, что происходит с PNG. Программа показывает методы, размеры critical chunks, лучший результат, время обработки. Это даёт больше контроля, чем чёрный ящик с кнопкой Compress.

Кому лучше выбрать другую программу

Если пользователь не хочет работать с командной строкой, Pngcrush будет лишним усложнением. Для ручной оптимизации нескольких картинок удобнее графические оболочки или онлайн-сервисы. Для современных автоматизированных пайплайнов с большим количеством файлов часто удобнее Oxipng. Для максимального lossy-уменьшения PNG лучше подходит pngquant. Для финального squeeze-этапа, где время не важно, можно рассмотреть zopflipng.

Выбор по задаче:

ЗадачаБолее удобный выбор
Простое drag-and-drop сжатиеImageOptim
Современная массовая lossless-оптимизацияOxipng
Максимальное уменьшение с допустимой потерейpngquant
Очень сильное Deflate-сжатиеzopflipng
Онлайн-сжатие без терминалаTinyPNG
Точная работа с chunks и CLI-контрольPngcrush

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

Частые ошибки при работе с Pngcrush

Попытка обработать не PNG

Pngcrush предназначен для PNG. Если передать JPEG, WebP или другой формат, задача будет некорректной. Программа не является универсальным image converter.

Неправильно:

pngcrush photo.jpg photo.png

Правильно использовать Pngcrush для PNG:

pngcrush image.png image.optimized.png

Перезапись оригиналов без проверки

Опасная команда:

pngcrush -ow *.png

Она может быть нормальной только после теста. Без резервной копии лучше так не делать.

Безопаснее:

mkdir optimizedpngcrush -d optimized *.png

Агрессивное удаление chunks без понимания

Команда:

pngcrush -rem allb input.png output.png

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

Ожидание улучшения качества

Pngcrush не повышает качество. Он не делает изображение резче, не восстанавливает детали, не убирает шум, не дорисовывает пиксели. Он оптимизирует PNG-структуру.

Запуск -brute на огромной папке без оценки времени

-brute может быть медленным. Для тысяч PNG лучше сначала протестировать несколько файлов:

pngcrush -brute test.png test.out.png

и только потом запускать массовую обработку.

Использование PNG там, где нужен другой формат

Если это фотография, PNG может быть плохим выбором. Pngcrush уменьшит файл в пределах возможностей PNG, но не заменит JPEG/WebP/AVIF.

Безопасность, лицензия и открытый код

Pngcrush — open-source-программа. Её можно использовать, изменять и распространять без оплаты. Лицензия находится в pngcrush.c и близка к libpng license, но не идентична ей.

Для практического пользователя это означает, что Pngcrush можно применять в личных, рабочих и автоматизированных сценариях без привязки к коммерческой подписке. Для разработчика важно другое: код можно изучать, собирать и при необходимости адаптировать, но при распространении изменённых вариантов нужно соблюдать условия лицензии и не искажать происхождение программы.

Итоги обзора

Pngcrush — точный, строгий и довольно старомодный по интерфейсу инструмент для PNG. Его сила не в красивом окне, а в контроле. Он умеет пересжимать IDAT, подбирать PNG-фильтры и zlib-параметры, запускать -brute, выполнять -reduce, удалять и добавлять chunks, работать с прозрачностью, gamma, sRGB, pHYs и текстовыми данными. Для пользователя, которому нужна обычная кнопка сжать картинку, это не самый удобный вариант. Для разработчика, верстальщика, администратора сайта или человека, который хочет управлять PNG на уровне структуры файла, Pngcrush остаётся полезным инструментом.

Его стоит использовать, когда нужна lossless PNG compression, пакетная обработка PNG, очистка PNG от метаданных, повторяемая оптимизация изображений для веба и контроль над ancillary chunks. Его не стоит использовать как универсальный редактор, замену Photoshop, конвертер всех форматов или средство улучшения качества. Pngcrush делает одну узкую работу: берёт PNG и пытается записать его компактнее или изменить его внутренние chunks по заданной команде. Для этой задачи он подходит хорошо.


Ваш адрес email не будет опубликован. Обязательные поля помечены *