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

Jpegoptim: оптимизация JPEG-файлов

Jpegoptim: оптимизация JPEG-файлов

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

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

Рекомендуем

ФотоМАСТЕР

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

Jpegoptim

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

Главная особенность Jpegoptim — работа из командной строки. Это делает программу особенно полезной там, где изображения нужно обрабатывать не по одному вручную, а потоком: в папке сайта, в каталоге фотогалереи, в серверном скрипте, в cron-задаче, в CI/CD-процессе или при подготовке большого архива JPG-файлов. Программа поддерживает lossless-оптимизацию на основе оптимизации таблиц Хаффмана и lossy-сжатие через ограничение максимального качества изображения. По умолчанию Jpegoptim изменяет входные файлы, если они действительно были оптимизированы; для сохранения результата в отдельный каталог используется -d / --dest.

Jpegoptim хорошо подходит для задач, где нужен предсказуемый CLI-инструмент: сжать JPEG для сайта, уменьшить вес JPG перед загрузкой в CMS, убрать EXIF перед публикацией, подготовить изображения для CDN, массово обработать фотографии через SSH, встроить оптимизацию в shell-скрипт. Это не универсальный конвертер изображений, а именно JPEG optimizer — программа для одного формата и одной группы задач.

Назначение программы

Jpegoptim используется для оптимизации и сжатия JPEG/JFIF-файлов. В базовом режиме программа старается уменьшить файл без видимого изменения картинки: она не меняет ширину, высоту, композицию, резкость или цвет, а работает с внутренним представлением JPEG. Такой режим удобен для файлов, которые уже подготовлены по размеру в пикселях, но всё ещё содержат лишние байты из-за неидеальной упаковки или ненужных маркеров.

Второй важный сценарий — lossy-сжатие. В этом режиме пользователь задаёт верхнюю границу качества через --max, а Jpegoptim перекодирует файл так, чтобы итоговый JPEG стал меньше. Это уже не без потерь в строгом смысле: изображение может визуально почти не отличаться от исходника, но часть данных будет отброшена. Именно поэтому lossy-команды лучше сначала проверять на копиях.

Jpegoptim решает такие задачи:

  • уменьшение размера JPEG-файлов без изменения разрешения;
  • удаление EXIF, XMP, IPTC, ICC, COM и других JPEG-маркеров;
  • пакетная обработка JPG-файлов в каталоге;
  • ограничение качества через --max;
  • попытка уложить файл в заданный размер через --size;
  • сохранение оптимизированных копий в отдельную директорию через --dest;
  • вывод статистики по обработке;
  • параллельная обработка нескольких файлов через --workers;
  • работа со списком файлов из stdin или отдельного файла;
  • использование в серверных сценариях и автоматизации.

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

Формат работы и интерфейс

У Jpegoptim нет графического интерфейса. Вся работа выполняется через команду jpegoptim, параметры и список файлов. Поэтому интерфейс программы — это справка в терминале, строки вывода, ключи запуска и сообщения о результате обработки.

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

jpegoptim [options] [filenames]

Самый простой запуск:

jpegoptim image.jpg

В таком варианте программа берёт image.jpg, оптимизирует его и при положительном результате перезаписывает исходный файл. Это удобно, когда пользователь точно понимает поведение команды. Для первой пробы безопаснее работать с копией или указывать отдельную папку назначения.

Справка Jpegoptim в терминале с перечнем основных ключей

Справка jpegoptim --help показывает ключевые элементы управления: --dest, --max, --size, --strip-all, --preserve, --totals, --verbose, --csv и другие параметры. Для консольной программы это фактически главный экран настроек. Здесь сразу видно, что Jpegoptim работает не через меню, а через конкретные флаги.

Первый запуск

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

jpegoptim --version
jpegoptim --help

Команда --version выводит сведения о сборке и используемой JPEG-библиотеке. Команда --help показывает доступные параметры. Для Jpegoptim это особенно важно, потому что набор ключей в разных сборках может отличаться: часть возможностей зависит от версии программы, часть — от того, с какой JPEG-библиотекой она собрана.

Проверочный запуск лучше делать на отдельном файле:

cp photo.jpg photo-test.jpg
jpegoptim photo-test.jpg

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

photo-test.jpg 3000x2000 24bit N Exif ICC JFIF [OK] 1248473 --> 1192040 bytes (4.52%), optimized.

В этой строке важны несколько частей:

Элемент вывода Что означает
photo-test.jpg имя обработанного файла
3000x2000 разрешение изображения
24bit глубина цвета
N или P обычный или прогрессивный JPEG
Exif, ICC, XMP, JFIF найденные маркеры и метаданные
[OK] файл корректно обработан
1248473 --> 1192040 bytes размер до и после
(4.52%) экономия в процентах
optimized / skipped файл изменён или пропущен

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

Базовая оптимизация одного JPEG

Самый простой сценарий — оптимизация одного изображения без указания дополнительных параметров:

jpegoptim image.jpg

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

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

ls -lh image.jpg
jpegoptim image.jpg
ls -lh image.jpg

Если файл оптимизировался, итоговый размер станет меньше. Если Jpegoptim пишет 0.00%, skipped, значит программа не нашла полезного уменьшения в выбранном режиме. Принудительная обработка через --force может пересобрать файл, но это не гарантирует экономию.

Безопасная работа через отдельную папку

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

mkdir optimized
jpegoptim --dest=optimized image.jpg

Или коротко:

jpegoptim -d optimized image.jpg

Смысл команды простой: исходный image.jpg остаётся на месте, а оптимизированная версия создаётся в папке optimized. Важная практическая деталь: если Jpegoptim не смог уменьшить файл, копия в папке назначения может не появиться. Это не сбой, а логика программы: она сохраняет оптимизированный результат, когда есть смысл его сохранять.

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

mkdir optimized
jpegoptim --dest=optimized *.jpg

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

Установка и подготовка окружения

Jpegoptim обычно используют в Linux- и Unix-подобных окружениях, но сама логика программы не привязана к графическому рабочему столу. Её запускают из терминала, через SSH, в скриптах сборки, на сервере или локально на рабочей машине. В пакетных системах программа описывается как command line utility для JPEG-оптимизации.

На Debian/Ubuntu-подобных системах команда установки обычно выглядит так:

sudo apt install jpegoptim

На macOS при использовании Homebrew команда выглядит так:

brew install jpegoptim

Homebrew описывает пакет как utility to optimize JPEG files и указывает зависимость от JPEG-кодека jpeg-turbo, который используется для операций кодирования и декодирования JPEG.

Пример установки Jpegoptim через терминал

 

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

Lossless-оптимизация

Lossless-режим — основная причина, по которой Jpegoptim часто используют для уже готовых изображений. В этом режиме программа не стремится визуально ухудшить картинку и не меняет разрешение. Она оптимизирует внутреннюю JPEG-структуру, в частности таблицы Хаффмана. Такой подход даёт экономию за счёт более эффективного кодирования данных, а не за счёт уменьшения картинки в пикселях.

Команда:

jpegoptim photo.jpg

Подходит для случаев, когда нужно:

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

Lossless-оптимизация не делает чудес. Если JPEG уже был сохранён качественным оптимизатором, выигрыш может быть нулевым. Если файл содержит неоптимальные таблицы, лишние маркеры или был создан камерой/редактором без акцента на минимальный размер, экономия может быть заметной.

Практический пример:

jpegoptim *.jpg

Эта команда обработает все JPG-файлы в текущей папке, которые подходят под маску *.jpg. Для файлов с расширением .JPG в верхнем регистре нужна отдельная маска:

jpegoptim *.JPG

Чтобы не пропустить оба варианта, удобно использовать find:

find . -type f ( -iname "*.jpg" -o -iname "*.jpeg" ) -print0 | xargs -0 jpegoptim

Здесь find ищет JPEG-файлы независимо от регистра расширения, а xargs -0 корректно передаёт имена с пробелами.

Lossy-сжатие через --max

Ключ --max задаёт максимальный фактор качества изображения. Диапазон — от 0 до 100. При использовании --max Jpegoptim переходит к lossy-оптимизации: он может перекодировать изображение с заданной верхней границей качества. Это снижает размер сильнее, чем обычный lossless-режим, но уже требует контроля результата.

Пример:

jpegoptim --max=85 image.jpg

Короткая форма:

jpegoptim -m85 image.jpg

Смысл команды: если исходный JPEG сохранён с качеством выше 85, Jpegoptim перекодирует его с верхней границей 85. Если файл уже соответствует этому уровню или ниже, результат может быть минимальным.

Типичные значения:

Значение --max Практический смысл
95 почти щадящий режим, небольшой выигрыш
90 аккуратное сжатие для крупных фотографий
85 популярный баланс для сайта
80 заметное уменьшение веса, обычно приемлемо для веба
70 агрессивное сжатие, возможны артефакты
50 и ниже использовать только для черновиков, миниатюр или технических превью

Для сайта часто начинают с --max=85:

jpegoptim --strip-all --max=85 image.jpg

Эта команда одновременно удаляет метаданные и ограничивает качество. Она подходит для изображений, где не нужно сохранять EXIF, GPS, XMP, комментарии и цветовые профили. Для фотографий, где важна точная цветопередача, --strip-all применять бездумно нельзя: удаление ICC-профиля может повлиять на интерпретацию цвета в отдельных сценариях.

Ограничение размера через --size

Ключ --size или коротко -S пытается привести файл к заданному размеру. Размер можно указывать в килобайтах или процентах. Этот режим тоже отключает чистую lossless-оптимизацию, потому что для достижения целевого веса программа должна подбирать качество перекодирования.

Пример ограничения до 250 КБ:

jpegoptim --size=250k image.jpg

Пример ограничения до 70% от исходного размера:

jpegoptim --size=70% image.jpg

Практический смысл --size — подготовка изображения под жёсткий лимит: форма загрузки, CMS, маркетплейс, почтовое вложение, аватар, баннерная система. Но этот ключ не гарантирует математически точное совпадение с указанным размером. Для --size нормальна ситуация, когда итоговый файл немного отличается от цели; повторный запуск иногда приближает результат к заданному лимиту.

Рабочий пример для папки:

mkdir out
jpegoptim --size=300k --dest=out *.jpg

Так исходники останутся нетронутыми, а Jpegoptim попробует создать версии до 300 КБ в каталоге out.

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

Метаданные часто занимают заметную часть JPEG-файла, особенно если изображение пришло с камеры, смартфона, графического редактора или фотобанка. Внутри могут быть EXIF-данные, GPS-координаты, XMP-блоки, IPTC-информация, комментарии, ICC-профили и другие маркеры.

По умолчанию Jpegoptim сохраняет распространённые маркеры EXIF, IPTC, ICC, XMP и COM, а неизвестные маркеры отбрасывает. Для явного удаления используются --strip-*, а для сохранения отдельных блоков при общей очистке — --keep-*.

Полная очистка:

jpegoptim --strip-all image.jpg

Удаление только EXIF:

jpegoptim --strip-exif image.jpg

Удаление комментариев:

jpegoptim --strip-com image.jpg

Удаление ICC-профилей:

jpegoptim --strip-icc image.jpg

Удаление XMP:

jpegoptim --strip-xmp image.jpg

Удаление IPTC/Photoshop APP13:

jpegoptim --strip-iptc image.jpg

Если нужно удалить почти всё, но сохранить EXIF и ICC, команда выглядит так:

jpegoptim --strip-all --keep-exif --keep-icc image.jpg

Такой сценарий полезен, когда нужно убрать лишние комментарии, XMP и IPTC, но сохранить данные камеры или цветовой профиль.

Таблица по метаданным:

Ключ Что делает Когда применять
--strip-all удаляет все маркеры, которые можно удалить публикация в вебе, приватность, максимальная очистка
--strip-exif удаляет EXIF скрыть данные камеры, дату, GPS
--strip-icc удаляет ICC-профиль только если цветовой профиль не нужен
--strip-xmp удаляет XMP убрать редакторские и CMS-метаданные
--strip-iptc удаляет IPTC/Photoshop APP13 убрать описания, ключевые слова, служебные поля
--strip-com удаляет JPEG-комментарии очистить текстовые комментарии
--strip-none / --keep-all сохраняет маркеры архив, фотобанк, рабочие материалы
--keep-exif сохраняет EXIF при общей очистке нужен технический паспорт снимка
--keep-icc сохраняет ICC при общей очистке важна цветопередача
--keep-xmp сохраняет XMP нужен редакторский workflow

Для сайта чаще всего используют:

jpegoptim --strip-all --max=85 image.jpg

Для архива с сохранением данных камеры:

jpegoptim --strip-none image.jpg

Для публикации без GPS и служебных полей, но с сохранением цветового профиля:

jpegoptim --strip-all --keep-icc image.jpg

Прогрессивный JPEG

Jpegoptim умеет управлять режимом progressive/non-progressive. В обычном JPEG изображение при загрузке отображается постепенно сверху вниз или появляется после получения достаточного объёма данных. Прогрессивный JPEG может показывать сначала грубую версию изображения, а затем уточнять детали по мере загрузки. Для веба это часто выглядит приятнее, особенно на медленных соединениях.

Основные ключи:

jpegoptim --all-progressive image.jpg
jpegoptim --all-normal image.jpg
jpegoptim --auto-mode image.jpg

--all-progressive принудительно делает выходной файл прогрессивным. --all-normal принудительно делает его обычным. --auto-mode выбирает обычный или прогрессивный вариант в зависимости от того, какой даёт меньший размер. По умолчанию Jpegoptim сохраняет исходный режим progressive/non-progressive, если не указать другой параметр.

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

jpegoptim --all-progressive --strip-all --max=85 image.jpg
jpegoptim --auto-mode --strip-all --max=85 image.jpg

--auto-mode удобен для больших наборов изображений, где заранее неизвестно, какой режим даст меньший результат. Но для строгих пайплайнов лучше зафиксировать поведение: либо всегда --all-progressive, либо всегда сохранять исходный режим.

Массовая обработка файлов

Jpegoptim особенно силён в пакетной обработке. Обработать один файл можно и графическим редактором, но когда файлов сотни или тысячи, командная строка становится удобнее.

Простая обработка всех JPG в текущей папке:

jpegoptim *.jpg

С сохранением результата в отдельную папку:

mkdir optimized
jpegoptim --dest=optimized *.jpg

С удалением метаданных и ограничением качества:

jpegoptim --strip-all --max=85 *.jpg

С обработкой .jpg и .jpeg во вложенных папках:

find ./images -type f ( -iname "*.jpg" -o -iname "*.jpeg" ) -print0 | xargs -0 jpegoptim --strip-all --max=85

Для безопасного запуска:

mkdir optimized
find ./images -type f ( -iname "*.jpg" -o -iname "*.jpeg" ) -print0 | xargs -0 jpegoptim --strip-all --max=85 --dest=optimized

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

Пример вывода справки Jpegoptim в Linux Mint

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

Чтение списка файлов

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

--files-stdin
--files-from=FILE

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

jpegoptim --strip-all --max=85 --files-from=images.txt

Файл images.txt должен содержать имена файлов, по одному на строку:

assets/photo-1.jpg
assets/photo-2.jpg
uploads/banner.jpeg

Пример через stdin:

find ./uploads -type f -iname "*.jpg" | jpegoptim --strip-all --max=85 --files-stdin

Этот режим полезен в CI/CD, где список изменённых изображений формируется отдельной командой. Например, можно оптимизировать только JPEG-файлы, изменённые в последнем коммите, а не весь каталог проекта.

Параллельная обработка через --workers

Для ускорения пакетной обработки используется ключ --workers. Он задаёт максимальное количество параллельных рабочих процессов. Возможность появилась в ветке 1.5.0, где в историю изменений внесён --workers=<max> для parallel processing.

Пример:

jpegoptim --workers=4 *.jpg

Или вместе с типичными веб-настройками:

jpegoptim --workers=4 --strip-all --max=85 *.jpg

Когда --workers полезен:

  • в папке много крупных JPEG-файлов;
  • машина имеет несколько ядер CPU;
  • изображения лежат на быстром SSD;
  • оптимизация запускается локально или на выделенном сервере;
  • нужно быстро обработать медиатеку перед деплоем.

Когда не стоит ставить слишком большое значение:

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

Разумная стартовая команда:

jpegoptim --workers=2 --strip-all --max=85 *.jpg

Для рабочей станции можно поднять до 4 или 8, но лучше смотреть на загрузку CPU и диска.

Тестовый запуск через --noaction

Ключ --noaction или -n нужен для проверки без реального изменения файлов:

jpegoptim --noaction image.jpg

Или:

jpegoptim -n --strip-all --max=85 image.jpg

Такой режим полезен перед массовой обработкой. Он показывает, что Jpegoptim собирается сделать, но не перезаписывает изображение. Это особенно важно, когда команда содержит --strip-all, --max или --size.

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

jpegoptim --noaction --strip-all --max=85 *.jpg

Если вывод выглядит ожидаемо, можно убрать --noaction и выполнить настоящую обработку:

jpegoptim --strip-all --max=85 *.jpg

Вывод статистики

Для оценки результата используются --totals, --verbose и --csv.

Команда с итогами:

jpegoptim --totals *.jpg

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

Подробный вывод:

jpegoptim --verbose image.jpg

Или коротко:

jpegoptim -v image.jpg

CSV-формат:

jpegoptim --csv *.jpg

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

jpegoptim --csv --strip-all --max=85 *.jpg > jpegoptim-report.csv

Такой отчёт можно потом разобрать скриптом, импортировать в таблицу или использовать в пайплайне контроля качества.

Работа через stdin и stdout

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

--stdin
--stdout

Пример:

cat image.jpg | jpegoptim --stdin > optimized.jpg

Или явный stdout:

jpegoptim --stdout image.jpg > optimized.jpg

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

Сохранение времени и прав файлов

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

--preserve
--preserve-perms

--preserve сохраняет временные метки файла. Это полезно, если дата изменения важна для архива, синхронизации, резервного копирования или генератора сайта.

jpegoptim --preserve image.jpg

--preserve-perms сохраняет права исходного файла при перезаписи:

jpegoptim --preserve-perms image.jpg

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

Практический безопасный вариант:

jpegoptim --preserve --preserve-perms --strip-all --max=85 *.jpg

Перезапись и принудительная обработка

За поведение при перезаписи отвечают:

--overwrite
--force

--overwrite имеет смысл вместе с --dest: он разрешает перезаписать файл назначения, если такой уже существует.

jpegoptim --dest=optimized --overwrite image.jpg

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

jpegoptim --force image.jpg

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

jpegoptim --force --all-progressive image.jpg

Но --force не означает обязательно уменьшить файл. Он означает выполнить обработку принудительно. Итоговый размер всё равно зависит от исходного изображения и выбранных параметров.

Порог экономии через --threshold

Ключ --threshold или -T задаёт минимальный процент выигрыша, ниже которого старый файл сохраняется. Это удобно, когда не хочется трогать изображения ради микроскопической экономии.

Пример:

jpegoptim --threshold=1 image.jpg

Или:

jpegoptim -T1 image.jpg

Смысл: если выигрыш меньше 1%, файл останется прежним. Такой подход хорош для больших архивов, где изменение timestamps, перезапись и резервное копирование важнее, чем экономия нескольких байт.

Для сайта можно использовать:

jpegoptim --threshold=0.5 --strip-all --max=85 *.jpg

Для архива:

jpegoptim --threshold=2 --preserve --preserve-perms *.jpg

Повторная оптимизация через --retry

Ключ --retry пытается рекурсивно оптимизировать файл до тех пор, пока размер больше не меняется. В истории изменений Jpegoptim этот параметр добавлен в ветке 1.5.6 вместе с --save-extra и --auto-mode.

Пример:

jpegoptim --retry image.jpg

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

Сохранение лишних данных после конца изображения

Ключ --save-extra сохраняет extraneous data after the end of image. Это узкий параметр для ситуаций, когда после формального конца JPEG-файла есть дополнительные данные, которые пользователь хочет оставить. В обычной веб-оптимизации такой хвост чаще не нужен, но в архивных или исследовательских сценариях его сохранение может быть принципиальным.

Команда:

jpegoptim --save-extra image.jpg

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

Проверка результата

Jpegoptim не показывает визуальное сравнение до/после. Проверка результата строится вокруг файловой системы, вывода программы и внешнего просмотра изображения.

Минимальная проверка:

ls -lh image.jpg
jpegoptim --strip-all --max=85 image.jpg
ls -lh image.jpg

Более безопасная проверка:

mkdir out
jpegoptim --strip-all --max=85 --dest=out image.jpg
ls -lh image.jpg out/image.jpg

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

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

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

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

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

Безопасный вариант:

mkdir optimized
find ./images -type f ( -iname "*.jpg" -o -iname "*.jpeg" ) -print0 | xargs -0 jpegoptim --strip-all --max=85 --dest=optimized

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

Для папки без вложений:

mkdir optimized
jpegoptim --strip-all --max=85 --dest=optimized images/*.jpg

После проверки можно заменить файлы в проекте:

cp optimized/*.jpg images/

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

Практический сценарий: очистка EXIF перед публикацией

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

Команда:

jpegoptim --strip-exif photo.jpg

Если нужно убрать не только EXIF, но и все прочие маркеры:

jpegoptim --strip-all photo.jpg

Для отдельной папки:

jpegoptim --strip-all public/*.jpg

С сохранением исходников:

mkdir clean
jpegoptim --strip-all --dest=clean public/*.jpg

Если важно сохранить ICC-профиль:

jpegoptim --strip-all --keep-icc --dest=clean public/*.jpg

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

Практический сценарий: ограничение веса для формы загрузки

Некоторые сайты принимают изображения только до определённого размера: например, до 500 КБ. В Jpegoptim для этого подходит --size.

jpegoptim --size=500k image.jpg

Чтобы не трогать исходник:

mkdir upload-ready
jpegoptim --size=500k --dest=upload-ready image.jpg

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

mkdir upload-ready
jpegoptim --size=500k --dest=upload-ready *.jpg

Важно понимать: --size=500k не меняет разрешение изображения. Если исходник огромный, например 8000×5000 пикселей, сжатие до 500 КБ может потребовать сильного снижения качества. В таких случаях сначала уменьшают размеры в пикселях другим инструментом, а уже потом запускают Jpegoptim.

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

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

find /var/www/site/uploads -type f ( -iname "*.jpg" -o -iname "*.jpeg" ) -print0 | xargs -0 jpegoptim --strip-all --max=85

Более аккуратный вариант с сохранением времени и прав:

find /var/www/site/uploads -type f ( -iname "*.jpg" -o -iname "*.jpeg" ) -print0 | xargs -0 jpegoptim --preserve --preserve-perms --strip-all --max=85

С отчётом:

find /var/www/site/uploads -type f ( -iname "*.jpg" -o -iname "*.jpeg" ) -print0 | xargs -0 jpegoptim --csv --strip-all --max=85 > jpegoptim-report.csv

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

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

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

#!/usr/bin/env bash
set -e

TARGET_DIR="./public/images"

find "$TARGET_DIR" -type f ( -iname "*.jpg" -o -iname "*.jpeg" ) -print0 
  | xargs -0 jpegoptim --strip-all --max=85 --threshold=0.5 --totals

Такой скрипт можно запускать перед сборкой сайта. Для более строгого процесса можно сделать проверку без изменения файлов:

jpegoptim --noaction --strip-all --max=85 image.jpg

Или сохранять оптимизированные копии:

mkdir -p build/images
jpegoptim --strip-all --max=85 --dest=build/images src/images/*.jpg

Jpegoptim хорошо вписывается в Unix-подход: одна программа делает одну задачу, а find, xargs, shell-скрипты и CI-система связывают её с остальным процессом.

Использование с CMS и статическими сайтами

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

Типовой процесс:

  1. выгрузить или найти каталог с JPEG;
  2. сделать резервную копию;
  3. выполнить тестовый запуск через --noaction;
  4. обработать копию через --dest;
  5. визуально проверить несколько типичных изображений;
  6. заменить файлы;
  7. очистить кеш CMS или CDN.

Для статического сайта часто достаточно команды:

find ./public -type f ( -iname "*.jpg" -o -iname "*.jpeg" ) -print0 | xargs -0 jpegoptim --strip-all --max=85 --totals

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

find ./dist -type f ( -iname "*.jpg" -o -iname "*.jpeg" ) -print0 | xargs -0 jpegoptim --strip-all --max=85 --totals

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

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

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

Ранние ветки заложили базовую модель работы: оптимизация JPEG, ключ -f, поддержка разных платформ, затем --overwrite и --preserve. В версии 1.2.2 изменилось поведение с EXIF и COM: эти маркеры перестали автоматически отбрасываться, а для контроля появились --strip-all, --strip-exif и --strip-com. В 1.2.3 добавились IPTC и ICC, что сделало программу полезнее для фотографий и изображений из профессиональных редакторов.

Версия 1.3.0 стала важной для веб-оптимизации: появилась поддержка progressive JPEG, ключи --all-normal и --all-progressive, а также -S / --size для задания целевого размера. Это расширило программу от простого lossless-оптимизатора до инструмента, которым можно управлять под конкретные ограничения публикации.

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

В 1.4.7 появились экспериментальная поддержка arithmetic coding, ключ --nofix, поддержка JFIF Extension markers, работа с nanosecond timestamps, исправления для --size при обработке нескольких файлов и новые --keep-* для связки с --strip-all. Эти изменения сделали управление маркерами более точным.

В 1.5.0 добавлен --workers=<max> для параллельной обработки. В 1.5.2 появились --files-from и --files-stdin, что усилило сценарии автоматизации. В 1.5.4 программа стала сохранять режим JPEG progressive/non-progressive по умолчанию. В 1.5.6 добавлены --retry, --save-extra и --auto-mode, а обработка изображения из standard input стала вести себя так же, как обработка файла.

Эта история хорошо объясняет характер Jpegoptim: развитие идёт не в сторону визуальных функций, а в сторону надёжности, контроля, автоматизации, метаданных и пакетной обработки.

Что можно сделать в Jpegoptim

Jpegoptim подходит для конкретного набора операций.

Сжать JPEG без изменения размеров

jpegoptim image.jpg

Программа оставляет ширину и высоту прежними, но пытается уменьшить вес файла.

Сжать JPEG с ограничением качества

jpegoptim --max=85 image.jpg

Изображение перекодируется с верхним уровнем качества 85.

Удалить все метаданные

jpegoptim --strip-all image.jpg

Подходит для веб-публикации и приватности.

Удалить только EXIF

jpegoptim --strip-exif image.jpg

Полезно, если нужно убрать данные камеры и потенциальные GPS-сведения.

Сохранить ICC при общей очистке

jpegoptim --strip-all --keep-icc image.jpg

Компромисс для изображений, где важна цветопередача.

Сделать JPEG прогрессивным

jpegoptim --all-progressive image.jpg

Полезно для веб-изображений.

Выбрать меньший режим автоматически

jpegoptim --auto-mode image.jpg

Программа выбирает normal или progressive по меньшему размеру.

Ограничить итоговый вес

jpegoptim --size=250k image.jpg

Подходит для лимитов загрузки.

Сохранить результат в отдельную папку

jpegoptim --dest=optimized image.jpg

Безопасный режим для тестов.

Обработать несколько файлов параллельно

jpegoptim --workers=4 *.jpg

Ускоряет обработку больших каталогов.

Получить CSV-отчёт

jpegoptim --csv *.jpg > report.csv

Удобно для анализа и логирования.

Что Jpegoptim не умеет

Ограничения у программы принципиальные, и их нужно учитывать.

Jpegoptim не изменяет размеры изображения. Если фотография слишком большая в пикселях, например 6000×4000, программа не сделает из неё 1600×1067. Она может уменьшить вес за счёт оптимизации или перекодирования, но resize нужно выполнять другим инструментом.

Jpegoptim не работает как универсальный конвертер форматов. Это утилита для JPEG/JFIF. Она не предназначена для PNG, GIF, WebP, AVIF, TIFF или SVG. Для PNG используют другие оптимизаторы, для WebP — cwebp, для AVIF — AVIF-кодировщики, для комплексных преобразований — ImageMagick или GraphicsMagick.

Jpegoptim не показывает визуальное сравнение. Нет окна до/после, ползунка качества, предпросмотра артефактов и увеличения фрагмента изображения. Контроль качества остаётся на пользователе.

Jpegoptim не редактирует изображение. Нельзя кадрировать, ретушировать, менять баланс белого, рисовать, добавлять текст, исправлять перспективу или работать со слоями.

Jpegoptim не подбирает качество на глаз. Ключ --max=85 — это числовое ограничение, а не интеллектуальная оценка эстетики. Для разных изображений одно и то же значение может выглядеть по-разному.

Jpegoptim не должен запускаться без понимания последствий. Команды с --strip-all, --max и --size могут удалить важные данные или ухудшить изображение. Для рабочих материалов лучше использовать --dest, резервные копии и тестовый запуск.

Рекомендованные профили команд

Осторожная lossless-оптимизация

jpegoptim --preserve --preserve-perms image.jpg

Подходит для архива, где важно сохранить дату и права файла.

Веб-оптимизация без сохранения метаданных

jpegoptim --strip-all --max=85 image.jpg

Подходит для большинства обычных фотографий на сайте.

Веб-оптимизация с сохранением ICC

jpegoptim --strip-all --keep-icc --max=85 image.jpg

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

Прогрессивные JPEG для сайта

jpegoptim --strip-all --max=85 --all-progressive image.jpg

Подходит для веб-страниц, где важна постепенная загрузка изображения.

Автоматический выбор normal/progressive

jpegoptim --strip-all --max=85 --auto-mode image.jpg

Подходит для наборов изображений, где нужен меньший размер без ручного выбора режима.

Подготовка к загрузке с лимитом веса

jpegoptim --strip-all --size=500k image.jpg

Подходит для форм, где есть ограничение на размер файла.

Массовая безопасная обработка

mkdir optimized
jpegoptim --strip-all --max=85 --dest=optimized *.jpg

Подходит для тестовой обработки папки без перезаписи исходников.

Серверная обработка с сохранением прав

find ./uploads -type f ( -iname "*.jpg" -o -iname "*.jpeg" ) -print0 | xargs -0 jpegoptim --preserve --preserve-perms --strip-all --max=85

Подходит для медиатеки сайта.

Пакетная обработка с отчётом

jpegoptim --csv --strip-all --max=85 *.jpg > jpegoptim-report.csv

Подходит для контроля результата.

Ошибки при работе с Jpegoptim

Запуск без резервной копии

Главная ошибка — сразу запускать lossy-сжатие на единственных исходниках:

jpegoptim --strip-all --max=70 *.jpg

Если результат не понравится, вернуть удалённые метаданные и потерянное качество не получится. Надёжнее так:

mkdir test-output
jpegoptim --strip-all --max=70 --dest=test-output *.jpg

Ожидание, что --size всегда даст точный вес

Команда:

jpegoptim --size=200k image.jpg

пытается приблизиться к цели, но итоговый файл не всегда получается ровно 200 КБ. Это нормальная особенность режима --size.

Удаление ICC-профиля без проверки цвета

--strip-all удаляет метаданные максимально жёстко. Для некоторых изображений удаление ICC может быть нежелательным. Если цвет важен, лучше использовать:

jpegoptim --strip-all --keep-icc image.jpg

Слишком низкое качество

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

Обработка не того формата

Команда не должна применяться к PNG, WebP или AVIF. Jpegoptim предназначен для JPEG/JFIF. Если в папке смешаны разные форматы, используйте фильтрацию:

find ./images -type f ( -iname "*.jpg" -o -iname "*.jpeg" ) -print0 | xargs -0 jpegoptim

Надежда на уменьшение разрешения

Jpegoptim не делает resize. Если нужно уменьшить изображение с 6000 px до 1600 px по ширине, нужен другой инструмент. После resize можно дополнительно прогнать JPEG через Jpegoptim.

Запуск на сервере без учёта нагрузки

Команда с --workers=16 может перегрузить слабый сервер. Лучше начинать с 2–4 worker-процессов и смотреть на нагрузку.

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

Jpegoptim занимает отдельное место среди инструментов для оптимизации изображений: он работает только с JPEG, не имеет GUI и хорошо подходит для автоматизации. Аналоги часто сильнее в других задачах — конвертации, визуальной настройке, мультиформатной обработке или более сложном подборе качества.

Программа Форматы Интерфейс Сильная сторона Ограничение
jpegtran JPEG CLI lossless-преобразования JPEG, повороты, оптимизация меньше удобных параметров для lossy-сценариев
MozJPEG cjpeg JPEG CLI сильное lossy-кодирование, ориентация на веб чаще требует перекодирования и отдельной настройки
jpeg-recompress JPEG CLI подбор качества по метрикам восприятия сложнее и медленнее для простых пакетных задач
ImageOptim JPEG, PNG, GIF, SVG и другие GUI на macOS удобная drag-and-drop-оптимизация и несколько движков хуже подходит для серверного SSH-процесса
Trimage JPEG, PNG GUI и CLI простая оптимизация изображений на Linux развитие и возможности зависят от внешних оптимизаторов
ImageMagick множество форматов CLI конвертация, resize, обработка, фильтры это универсальный комбайн, а не узкий JPEG-оптимизатор
GraphicsMagick множество форматов CLI быстрая пакетная обработка и преобразования для простой JPEG-оптимизации избыточен
Squoosh множество форматов веб-интерфейс визуальный подбор качества и формата не так удобен для серверной пакетной обработки
jpegoptim-bin / imagemin-плагины JPEG в Node.js-проектах CLI/API интеграция в frontend-сборку это обёртки и связки для экосистемы Node.js

jpegtran

jpegtran хорошо подходит для lossless-операций: поворота, транспонирования, оптимизации и удаления данных без перекодирования изображения в привычном lossy-смысле. Если нужно повернуть JPEG без потери качества, jpegtran часто уместнее. Если нужно быстро обработать каталог сайта с --strip-all, --max, --size, --dest, --workers и отчётом, Jpegoptim удобнее.

MozJPEG

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

jpeg-recompress

jpeg-recompress интересен тем, что подбирает качество с использованием метрик, а не просто принимает число --max. Это полезно, когда нужно автоматически искать баланс между весом и визуальным качеством. Но для массовой серверной задачи очистить метаданные и сжать до разумного уровня Jpegoptim проще и быстрее в применении.

ImageOptim

ImageOptim удобен для пользователей macOS, которым нужен графический интерфейс: перетащил файлы, получил результат. Он может использовать несколько движков оптимизации и хорошо подходит для ручной подготовки ассетов. Но Jpegoptim лучше там, где нет GUI: SSH, cron, Docker, CI/CD, серверный каталог, shell-скрипт.

Trimage

Trimage — графическая оболочка и CLI-инструмент для оптимизации изображений, который работает через внешние оптимизаторы, включая jpegoptim для JPEG. Он удобнее для пользователя, которому нужен простой интерфейс, но сам по себе менее прямолинеен, если задача — управлять именно JPEG-параметрами через командную строку.

ImageMagick

ImageMagick умеет почти всё: менять размер, конвертировать форматы, обрезать, поворачивать, накладывать эффекты, менять качество JPEG. Но универсальность усложняет простые задачи. Когда нужно только оптимизировать JPEG без лишней обработки, Jpegoptim компактнее и понятнее.

Сильные стороны

Jpegoptim хорош не количеством функций, а точностью назначения.

Главные преимущества:

  • простая командная модель;
  • быстрый запуск из терминала;
  • lossless-оптимизация JPEG;
  • lossy-сжатие через понятный --max;
  • удаление метаданных через --strip-*;
  • сохранение отдельных маркеров через --keep-*;
  • пакетная обработка через маски, find, xargs;
  • отдельная папка результата через --dest;
  • тестовый запуск через --noaction;
  • CSV-вывод для отчётов;
  • параллельная обработка через --workers;
  • удобство для серверов и автоматизации;
  • отсутствие зависимости от графической оболочки;
  • предсказуемость в shell-скриптах.

Jpegoptim особенно удобен, когда нужно сделать одну операцию много раз. Вручную оптимизировать 300 изображений в редакторе неудобно. Одной командой — нормально.

Слабые стороны

Недостатки у программы тоже очевидны.

Главные ограничения:

  • нет графического интерфейса;
  • нет визуального предпросмотра качества;
  • нет сравнения до/после;
  • работает только с JPEG/JFIF;
  • не меняет размер в пикселях;
  • не конвертирует в WebP или AVIF;
  • не редактирует изображение;
  • может перезаписать исходники;
  • требует понимания ключей;
  • lossy-режим нужно проверять глазами;
  • --strip-all может удалить полезные метаданные;
  • --size не всегда даёт идеально точный целевой вес.

Это не минусы в смысле плохой реализации. Это границы инструмента. Jpegoptim создан для оптимизации JPEG, а не для всего цикла работы с изображениями.

Когда программа подходит лучше всего

Jpegoptim стоит использовать, когда:

  • изображения уже имеют нужное разрешение;
  • формат JPEG выбран осознанно;
  • нужно уменьшить размер без открытия редактора;
  • требуется массовая обработка;
  • работа идёт на сервере;
  • нужна автоматизация через скрипт;
  • нужно удалить EXIF/XMP/IPTC;
  • нужно сжать изображения для сайта;
  • нужно встроить оптимизацию в пайплайн;
  • важны скорость и простота.

Особенно удачный сценарий — каталог веб-изображений:

jpegoptim --strip-all --max=85 --all-progressive *.jpg

Или безопасно:

mkdir optimized
jpegoptim --strip-all --max=85 --all-progressive --dest=optimized *.jpg

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

Другой инструмент нужен, если требуется:

  • изменить ширину и высоту изображения;
  • конвертировать JPEG в WebP или AVIF;
  • оптимизировать PNG;
  • визуально подобрать качество;
  • обработать изображение как фотографию;
  • применить фильтры или коррекцию;
  • работать со слоями;
  • получить графический drag-and-drop-интерфейс;
  • автоматически сравнивать качество по сложным метрикам;
  • сделать универсальный pipeline для разных форматов.

Для resize и конвертации уместнее ImageMagick или GraphicsMagick. Для современного веб-кодирования — WebP/AVIF-инструменты. Для визуального подбора — Squoosh или графический редактор. Для macOS-пользователя без терминала — ImageOptim.

Роль Jpegoptim в веб-производительности

Изображения часто занимают значительную часть веса страницы. JPEG-фотографии в баннерах, галереях, карточках товаров, блогах и портфолио могут сильно влиять на скорость загрузки. Jpegoptim помогает убрать лишние байты без изменения HTML, CSS или JavaScript.

Программа особенно полезна в трёх местах:

  1. перед публикацией изображений;
  2. после экспорта из редактора;
  3. в автоматической сборке сайта.

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

find ./dist -type f ( -iname "*.jpg" -o -iname "*.jpeg" ) -print0 | xargs -0 jpegoptim --strip-all --max=85 --all-progressive --totals

Эта команда очищает метаданные, ограничивает качество, делает JPEG прогрессивными и выводит общий результат. Для CI/CD это почти идеальный формат: команда понятная, результат логируется, поведение воспроизводимо.

Работа с приватностью

Удаление EXIF — не только про размер файла. Это ещё и про приватность. Фотографии со смартфона могут содержать модель устройства, дату съёмки, параметры камеры и геоданные. Перед публикацией на сайте, форуме, маркетплейсе или в открытой галерее такие данные часто лучше убрать.

Команда:

jpegoptim --strip-exif image.jpg

Более жёсткая очистка:

jpegoptim --strip-all image.jpg

Для набора изображений:

jpegoptim --strip-all *.jpg

Для безопасной очистки в отдельную папку:

mkdir public
jpegoptim --strip-all --dest=public *.jpg

Это простой способ подготовить изображения к публикации без открытия EXIF-редактора.

Работа с качеством

Jpegoptim не показывает ползунок качества, но управляет им через число. Главное — понимать, что качество JPEG не является абсолютной универсальной шкалой. --max=85 для одной фотографии может выглядеть отлично, а для другой — дать заметные артефакты.

Рекомендуемый подход:

  1. выбрать 5–10 типичных изображений;
  2. прогнать их с --max=90;
  3. сравнить размер и качество;
  4. попробовать --max=85;
  5. проверить сложные участки;
  6. только потом запускать всю папку.

Команды для теста:

mkdir q90 q85 q80

jpegoptim --max=90 --dest=q90 image.jpg
jpegoptim --max=85 --dest=q85 image.jpg
jpegoptim --max=80 --dest=q80 image.jpg

После этого можно открыть три версии рядом и выбрать подходящий профиль.

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

Работа с именами файлов и пробелами

Команда:

jpegoptim *.jpg

обычно работает, но при сложных именах и вложенных папках надёжнее использовать find -print0 и xargs -0:

find . -type f -iname "*.jpg" -print0 | xargs -0 jpegoptim

Так корректно обрабатываются файлы вроде:

My Photo 01.jpg
banner final version.jpeg
фото для сайта.jpg

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

Работа с отчётами

Если нужно не просто сжать изображения, а показать результат, используйте --totals и --csv.

Итог по папке:

jpegoptim --totals *.jpg

CSV:

jpegoptim --csv *.jpg > report.csv

Команда для CI:

find ./public -type f -iname "*.jpg" -print0 | xargs -0 jpegoptim --csv --strip-all --max=85 > jpegoptim.csv

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

Лучшие практики

Для Jpegoptim лучше придерживаться нескольких правил.

Сначала проверять на копии:

cp image.jpg image-test.jpg
jpegoptim --strip-all --max=85 image-test.jpg

Для папки использовать --dest:

mkdir optimized
jpegoptim --strip-all --max=85 --dest=optimized *.jpg

Не удалять ICC без необходимости:

jpegoptim --strip-all --keep-icc --max=85 image.jpg

Перед массовым запуском использовать --noaction:

jpegoptim --noaction --strip-all --max=85 *.jpg

Для сервера сохранять права и даты:

jpegoptim --preserve --preserve-perms --strip-all --max=85 image.jpg

Для больших каталогов ограничивать параллельность:

jpegoptim --workers=4 --strip-all --max=85 *.jpg

Для CI сохранять отчёт:

jpegoptim --csv --strip-all --max=85 *.jpg > report.csv

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

Jpegoptim — сильная программа в своей узкой области. Она не пытается быть фоторедактором, конвертером всех форматов или визуальным компрессором с предпросмотром. Её назначение — оптимизация JPEG/JFIF из командной строки, и именно в этом сценарии она удобна.

Для обычного пользователя без опыта терминала Jpegoptim может показаться сухой и непривычной. Здесь нет кнопки Открыть, нет меню Экспорт, нет предпросмотра качества. Но для администратора сайта, разработчика, DevOps-специалиста, владельца большой медиатеки или автора статического сайта такая модель часто лучше графической: одна команда обрабатывает сотни файлов, параметры легко повторить, результат можно записать в отчёт, а сам процесс встроить в автоматизацию.

Сильнее всего Jpegoptim раскрывается в задачах веб-подготовки JPEG: убрать EXIF, сократить размер, ограничить качество, сделать прогрессивный JPEG, обработать каталог, сохранить права и получить статистику. Программа требует аккуратности, потому что по умолчанию может изменять исходники, но при грамотном использовании --dest, --noaction, --preserve, --strip-* и --max она становится надёжным инструментом для регулярной оптимизации изображений.