nodejs выбирает между JIMP и MOZJPEG

Мне было интересно, есть ли веская причина использовать jimp против imagemin-mozjpeg для сжатия jpeg (я уже использую как imagemin, так и jimp в моем проекте, imagemin-webp для обслуживания изображений следующего поколения и jimp для преобразования pngs в jpegs в редких случаях) Поэтому я больше ищу рассуждения, основанные на следующем:

  1. Спектакль
  2. Надежность (я заметил, что есть некоторые JPEG-файлы, с которыми у mozjpeg возникают проблемы, и они не работают. В частности, те, с которыми я использовал программу манипуляции изображениями GNU [GIMP].)

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

Вот несколько быстрых ссылок на упомянутые пакеты NPM, если они кому-то понадобятся:
imagemin-mozjpeg
jimp

2 ответа

Спектакль

imagemin-mozjpeg использует mozjpeg для обработки изображений. А сам mozjpeg сделан на языке C. В то время как jimp использует javascript для его обработки.

Как упоминается в основном репозитории jimp:

Библиотека обработки изображений для Node, полностью написанная на JavaScript, без собственных зависимостей.

Мы знаем разницу в производительности между Javascript и C.

Надежность

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

mozjpeg:

  • Звезда: 4,1 тыс.
  • Открытых выпусков: 76
  • Закрытые выпуски: 186

скакать:

  • Звезда: 10,3 тыс.
  • Открытых выпусков: 157
  • Закрытых выпусков: 430

Я тоже не на стороне. Все они хорошо сработали. Я очень ценю работу сопровождающих и участников библиотеки библиотеки.

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

Я настоятельно рекомендую прочитать. Действительно ли WebP лучше, чем JPEG?это обсуждение), который показывает, что даже среди библиотек сжатия JPEG реализация может оказать значительное влияние на степень сжатия.

Короче говоря, MozJPEG создает файлы jpeg, которые на 10% меньше, чем файлы jpeg, созданные эталонной реализацией JPEG (libjpeg). Что еще более интересно, для изображений размером более 500 пикселей MozJPEG фактически создает файлы jpeg, которые меньше, чем WebP.

Это приводит к интересному вопросу. Это будет зависеть именно от вашего варианта использования и приоритетов, но на самом деле может иметь смысл упростить и использовать MozJPEG для всего и полностью отказаться от WebP.

Забегая вперед, AVIF может иметь смысл как настоящий формат следующего поколения (предоставляющий изображения меньшего размера на 30%), но поддержка браузеров "скоро появится". В качестве альтернативы, JPEG XL также выглядит многообещающе, но стандарт еще не доработан. HEIC проблематичен, и я бы не стал рассчитывать на широкую поддержку.


Предупреждение относительно jimp:

Поскольку jimp реализован на чистом JavaScript, все операции с изображениями в конечном итоге блокируют поток JS. Это катастрофа в node.js.

Чтобы запустить jimp в потоке, необходимо вручную использовать новый API рабочих потоков.


Наконец, предупреждение относительно выбора библиотек для работы с изображениями, как правило, в мире node.js:

Из того, что я видел, большинство из них в конечном итоге записывают временные файлы на диск, а затем вызывают дочерний процесс для выполнения фактической работы, а затем считывают результат обратно (например, что-то вроде child_process.exec('imageresizer -in temp/file.jpg -out temp/resized.jpg')).

Это не идеальный способ сделать это, и это может быть особенно удивительно, когда API выглядит примерно так: var img = await resizeImg(buffer), что не похоже на запись на диск.

imagemin - одна из таких библиотек; Я бы избегал этого там, где важна производительность.

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

Я никогда не использовал его, но node-mozjpeg выглядит хорошим кандидатом.

Другие вопросы по тегам