ImageMagick з mozjpeg
... або як отримати 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