Pngcrush: консольная утилита для сжатия PNG
Pngcrush — узкоспециализированная программа для работы с PNG-файлами. Это не редактор изображений, не просмотрщик и не универсальный конвертер, а командная утилита, которая оптимизирует PNG за счёт повторного сжатия IDAT-данных, перебора PNG-фильтров, выбора параметров zlib и управления служебными блоками внутри файла. Главная задача Pngcrush — уменьшить размер PNG без изменения видимого изображения, когда речь идёт о стандартной lossless-оптимизации.
Скачать Pngcrush
Новейшая версия для Windows и macOS. Удобный редактор с ИИ и профессиональными функциями.
Pngcrush особенно уместен там, где PNG используется не как случайный формат, а как часть рабочего процесса: иконки интерфейса, скриншоты, элементы сайта, графика приложения, технические схемы, изображения с прозрачностью, наборы ассетов для сборки. Его смысл не в том, чтобы улучшить картинку, а в том, чтобы записать те же данные компактнее или убрать из PNG лишние ancillary chunks: текстовые комментарии, часть метаданных, отдельные цветовые и служебные блоки, если они не нужны в конкретной задаче.

У программы нет привычных кнопок вроде 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;добавление
sRGBrendering intent через-srgb;попытка обработки PNG с ошибками через
-fix;диагностика файла без создания результата через
-n;перезапись файла на месте через
-ow.
Pngcrush не делает магии. Если исходный PNG уже прошёл сильную оптимизацию, выигрыш может быть нулевым или очень маленьким. Если изображение изначально сохранено неудачно, содержит лишние chunks, неоптимальную фильтрацию или тяжёлую структуру IDAT, программа может заметно уменьшить размер. Поэтому корректнее воспринимать Pngcrush как инструмент точной recompress-обработки, а не как гарантированный способ сжать любой PNG на 70%.
Интерфейс программы: командная строка вместо окон и кнопок
Pngcrush управляется только через команды. После запуска без понятных аргументов или с параметром справки пользователь видит текстовый список синтаксиса и опций. Именно этот экран заменяет привычное окно настроек. В нём перечислены параметры для выбора метода, фильтра, уровня zlib, каталога вывода, расширения, перезаписи, удаления chunks, вставки текстовых данных и других операций.

В графической программе пользователь обычно открывает изображение через меню 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 не ухудшает изображение. Это не quality 80%, не JPEG-подобное сжатие и не замыливание картинки. Программа не перерисовывает изображение, не удаляет видимые детали, не меняет разрешение и не выполняет ретушь. Она заново упаковывает PNG-данные.
Внутри команды можно встретить такие обозначения:
| Обозначение в выводе | Что означает |
|---|---|
IDAT | основные сжатые данные изображения |
method | метод Pngcrush, то есть комбинация параметров |
ws | window size, окно сжатия |
fm | filter method |
zl | zlib compression level |
zs | zlib 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.pngpngcrush -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 или если результат нужно было сравнить с оригиналом, откатиться будет сложнее.
Безопасная схема:
Сначала обработать файлы в отдельную папку через
-d.Проверить размеры и внешний вид.
Сравнить структуру PNG, если важны chunks.
Только после этого использовать
-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.pngPngcrush различает известные chunks и неизвестные chunks. Для известных chunks можно использовать нижний регистр, например -rem bkgd эквивалентно удалению bKGD. Для неизвестных chunks важен точный регистр. Это важно, потому что PNG chunk names чувствительны к регистру.
Есть и более широкие варианты:
pngcrush -rem alla input.png output.pngpngcrush -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— вставкаtEXtchunk;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:
| Значение | Назначение |
|---|---|
0 | perceptual |
1 | relative colorimetric |
2 | saturation |
3 | absolute colorimetric |
Для логотипов и брендовой графики такие данные могут быть важны. Поэтому команда вида -rem allb не должна применяться автоматически ко всем изображениям подряд. Если задача — просто уменьшить размер и картинка используется как декоративный элемент сайта, удаление части данных может быть нормальным. Если задача — сохранить цветовую интерпретацию, цветовые chunks лучше не трогать без проверки.
Запись разрешения через -res
Параметр -res записывает pHYs chunk с разрешением в dpi:
pngcrush -res 300 input.png output.pngpHYs 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.pngpngcrush -v -v input.png output.pngpngcrush -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.pngpngcrush -z 1 input.png output.pngpngcrush -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Доступные типы:
| Значение | Фильтр |
|---|---|
0 | none |
1 | sub |
2 | up |
3 | average |
4 | paeth |
5 | adaptive |
Обычно лучше не фиксировать фильтр вручную без причины. 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 для рабочих задач
| Задача | Команда | Комментарий |
|---|---|---|
| Оптимизировать один PNG | pngcrush input.png output.png | безопасный базовый запуск |
| Глубокая оптимизация | pngcrush -brute input.png output.png | медленнее, но тщательнее |
| Попытка lossless-снижения битности | pngcrush -reduce input.png output.png | полезно для простых PNG |
| Оптимизация с удалением части chunks | pngcrush -rem allb input.png output.png | применять осознанно |
| Удалить текстовые chunks | pngcrush -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 |
| Записать dpi | pngcrush -res 300 in.png out.png | добавляет pHYs |
| Задать sRGB intent | pngcrush -srgb 0 in.png out.png | работа с цветовой интерпретацией |
| Заменить gamma | pngcrush -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/*.pngPowerShell-скрипт:
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.
| Программа | Тип | Сильные стороны | Ограничения |
|---|---|---|---|
| OptiPNG | CLI PNG-оптимизатор | простая lossless-оптимизация, пересжатие PNG, конвертация некоторых внешних форматов в PNG | меньше акцента на ручную хирургию chunks |
| Oxipng | CLI PNG/APNG-оптимизатор | современный многопоточный lossless-подход, хорош для build-процессов и массовой обработки | меньше исторической ориентации на ручную работу с отдельными chunks |
| pngquant | CLI/library для PNG | сильное уменьшение размера за счёт преобразования в 8-битный PNG с альфа-каналом | это lossy-подход, не строгая lossless-оптимизация |
| ZopfliPNG / zopflipng | CLI 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 по заданной команде. Для этой задачи он подходит хорошо.
