Jpegoptim против jpegtran vs mozjpeg

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

Добавление к путанице, это Reddit thread предполагает, что mozjpeg использует тот же алгоритм, который используется в jpegcrush, и что jpegcrush является оберткой для jpegtran... так что мы набрали полный круг? Я могу только предположить, что те комментарии Reddit ошибочны, может ли кто-нибудь подтвердить это?

Ответ 1

Библиотека MozJPEG использует один алгоритм, вдохновленный jpegcrush (оптимизированное прогрессивное сканирование), но технически это совершенно новая реализация.

Библиотека MozJPEG является заменой для популярного libjpeg, поэтому почти каждый инструмент, связанный с JPEG, может быть скомпилирован в "обычных" и "MozJPEG" вариантах.

Существует "регулярная" jpegtran и версия MozJPEG jpegtran. То же самое, но версия MozJPEG имеет разные настройки по умолчанию и выполняет дополнительную работу для сжатия.

Аналогично, jpegoptim обычно создается с помощью файла libjpeg, но также возможно построить его с версией libjpeg в версии MozjpEG (например, ImageOptim делает это).


Существует два способа использования MozJPEG:

  • lossless (возьмите существующий файл JPEG и сделайте его немного меньше). Это то, что делает MozJPEG jpegtran.
  • lossy (создайте новый JPEG файл из несжатых пикселей с более высоким соотношением качество/размер файла). Это то, что делает MozJPEG cjpeg, и другие инструменты, такие как jpegoptim, могут быть сделаны с MozJPEG.

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

Более точный анализ скорости здесь: https://libjpeg-turbo.org/About/Mozjpeg

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