Oct. 18th, 2021

henry_flower: A melancholy wolf (Default)

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

  1. Утілітою cjpeg (ув федорі--libjpeg-turbo-utils)

     $ cjpeg -progressive -quality 60 src.ppm > cjpeg-libjpeg-turbo.jpg
  2. Системним ImageMagick без трюків:

     $ convert -interlace plane -quality 60 src.ppm \
         imagemagick-libjpeg-turbo.jpg

    де аргумента -interlace plane означає progressive.

  3. Системним 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

June 2025

M T W T F S S
      1
2345678
91011 12131415
16171819202122
23242526272829
30      

Expand Cut Tags

No cut tags