ImageMagick з mozjpeg
Oct. 18th, 2021 19:55... або як отримати jpg файли меншого розміру, не змінюючи таблицю
квантування (параметр компресії -quality NNN
).
ImageMagick для маніпуляцій з jpeg використовує бібліотеку libjpeg-turbo. Мозілла форкнула останню і назвала результат mozjpeg:
'MozJPEG is compatible with the libjpeg API and ABI. It is intended to be a drop-in replacement for libjpeg.'
Тобто, в теорії, можна після збірки mozjpeg або ① перекомпілювати
ImageMagick, вказавши ув CPPFLAGS та LDFLAGS шлях до mozjpeg, або ②
через LD_LIBRARY_PATH
змусити вже встановлений, системний
ImageMagick використовувати мозилівського форка.
Я спробував обидва варіянти. У 1му випадку, ImageMagick вдалося надурити лише з версією mozjpeg 3.2; у 2му запрацювала найсвіжіша master гілка (пардон, main).
У нових версіях mozjpeg перейшов з autotools на cmake, тому генерація мейкфайлів тепер надійно працює лише на мошинах qa-калік ув мозиллі.
$ git clone https://github.com/ImageMagick/ImageMagick
$ mkdir ImageMagick/_out
$ cd !$
$ cmake -DCMAKE_INSTALL_PREFIX:PATH=`pwd`/1 -DENABLE_STATIC=0 -G"Unix Makefiles" ..
$ make install
Конвертації файлу src.ppm
:
Утілітою cjpeg (ув федорі--libjpeg-turbo-utils)
$ cjpeg -progressive -quality 60 src.ppm > cjpeg-libjpeg-turbo.jpg
Системним ImageMagick без трюків:
$ convert -interlace plane -quality 60 src.ppm \ imagemagick-libjpeg-turbo.jpg
де аргумента
-interlace plane
означає progressive.Системним ImageMagick, але використовуючи свіжий mozjpeg:
$ LD_LIBRARY_PATH=~/tmp/mozjpeg/_out/1/lib64 convert \ -quality 60 src.ppm imagemagick-mozjpeg.jpg
аргумента
-interlace plane
тут є непотрібним, т.я. mozjpeg його вмикає автоматично по замовчуванню.
Результат:
$ du -b * | sort -n
40854 imagemagick-mozjpeg.jpg
54183 imagemagick-libjpeg-turbo.jpg
54302 cjpeg-libjpeg-turbo.jpg
2764816 src.ppm