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

В тесте принимали участие следующие программы.

Для PNG:

1. Leanify 0.4.3 (x64)
2. pingo v0.79c
3. pinga v0.09
4. OptiPNG 0.7.6
5. pngout
6. PngOptimizer 2.5 (x64)
7. advpng aka AdvanceCOMP v1.23
8. ECT 0.6 (x64)
9. TruePNG 0.6.2.2
10. pngwolf-zopfli 1.1.1 (x64)

Для JPEG:

1. Leanify 0.4.3 (x64)
2. pingo v0.79c
3. ECT 0.6 (x64)
4. mozjpeg 3.2 (x64)
5. jhead 3.00
6. jpegoptim v1.4.4 (x64)
7. jpegtran

Было отобрано 100 PNG файлов и 100 JPG файлов в качестве тестовой выборки. Разных размеров и разрешения от совсем маленьких до огромных. Каждая из программ была запущена на всём наборе. Считался размер файла после оптимизации и сколько времени потребовалось программе на оптимизацию. Сводные таблицы приведены ниже.

Таблица 1. Лучшие оптимизаторы PNG по уровню компрессии
Максимум 88.49
1 место ECT 88.98
2 место Leanify 89.62
3 место Pingo 89.69
4 место pngwolf 91.34
5 место pngout 91.85
6 место TRUEPng 93.01
7 место Optipng 94.19
8 место pinga 94.8
9 место PNGOptimizer 95.13
10 место advpng 97.27

Таблица 2. Лучшие оптимизаторы PNG по скорости работы
1 место PNGOptimizer 00:04:08
2 место pinga 00:21:41
3 место Pingo 00:23:15
4 место TruePNG 01:53:29
5 место Leanify 01:57:00
6 место pngout 02:53:09
7 место pngwolf 02:55:26
8 место ECT 03:06:08
9 место advpng 03:25:34
10 место Optipng 03:39:05

Таблица 3. Сводная таблица по PNG оптимизаторам
ПО Speed Rank Compression Rank Overall rank Open source
Pingo 3 3 6 -
Leanify 5 2 7 +
ECT 8 1 9 +
PNGOptimizer 1 9 10 +
TruePNG 4 6 10 -
pinga 2 8 10 -
pngout 6 5 11 +
pngwolf 7 4 11 +
Optipng 10 7 17 +
advpng 9 10 19 +

Таблица 4. Лучшие оптимизаторы JPG по уровню компрессии
1 место ECT 89.996
1 место pingo 89.996
1 место leanify 89.997
1 место mozjpeg 89.999
5 место jpegoptim 90.880
6 место jpegtran 90.924
7 место jhead 99.592

Таблица 5. Лучшие оптимизаторы JPG по скорости работы
1 место jhead 00:00:25
2 место jpegtran 00:00:52
3 место jpegoptim 00:01:03
4 место leanify 00:01:30
5 место pingo 00:01:42
6 место mozjpeg 00:01:55
7 место ECT 00:02:52

Таблица 6. Сводная таблица по JPG оптимизаторам
Soft Speed Rank Compression Rank Overall rank Open source
leanify 4 1 5 +
jpegoptim 3 2 5 +
jpegtran 2 3 5 +
jhead 1 4 5 +
pingo 5 1 6 -
mozjpeg 6 1 7 +
ECT 7 1 8 +

Параметры запусков


Тестирование проводилось на платформе Windows 10 (x64), i7 — 4930K, 32gb RAM. Все программы где стоит плюсик в графе Open Source соберутся на Linux. Не работают под Linux только 3 программы: Pingo, Pinga и TRUEpng.

PNG:
Leanify -i 15 -q
Pingo -s4
pinga -lossless -more
Optipng -o7 -strip all -quiet
pngout /s0 /q /y /r /d0 /mincodes0 /k1
PngOptimizer -file
advpng -z -q -4 -i 20
ECT --allfilters --mt-deflate -strip --strict -quiet -9
TruePNG /i0 /tz /quiet /y /md remove all /g0 /o4
pngwolf --strip-optional --out-deflate=zopfli,iter=30 --in= --out=

JPEG:

Leanify -i 15 -q
Pingo -s4
ECT --mt-deflate -strip -progressive --allfilters --strict -quiet -9
mozjpegtran -outfile -progressive
jhead -autorot -purejpg -di -dx -dt -zt -q
jpegoptim --strip-all -o -q --all-progressive
jpegtran -copy none -progressive

Для своих внутренних целей решили использовать Leanify. И сделали небольшой тестовый сайтик, если кому-то нужно оптимизировать небольшое число изображений он-лайн:

> lossless-image-optimization.com

Для локального запуска можно использовать FileOptimizer. Он запускает последовательно почти все указанные выше оптимизаторы один за одним на одном файле и как следствие работает достаточно долго, но выдаёт результат близкий к максимальному.

Ссылки
> Архив с тестовыми файлами PNG (100 штук)
> Архив с тестовыми файлами JPG (100 штук)
> Подробная таблица по всем файлам на Google.Docs
Поделиться с друзьями
-->

Комментарии (27)


  1. basilbasilbasil
    10.04.2017 20:14

    так оптимизаторы сжимают или подбирают параметры?
    попробовали бы еще на CUDA
    http://www.fastcompression.com/download/download.htm


    1. Turbo
      10.04.2017 20:20
      +1

      Все оптимизаторы в тесте выполняют оптимизацию файлов без потери качества. Размер уменьшается, но на качество самого файла не влияет. Насколько мне известно (могу ошибаться) для CUDA таких оптимизаторов нет.


      1. hisbvdis
        11.04.2017 09:43

        Уточните пожалуйста, что значит «оптимизация файла без потери качества»? Речь идет о субъективном отсутствии видимых визуальных изменений или непосредственно изображение вообще не сжимается?

        Просто я протестировал на Вашей страничке сжатие картинки и очень удивился уменьшению размера на 5%. Эти 5% стоят того, чтобы использовать подобную библиотеку? Например, на том же сервисе tinyjpg картинка уменьшилась в 2 раза также без видимых изменений.


        1. Turbo
          11.04.2017 10:13
          +4

          Это означает если вы попиксельно картинку сравните разницы не будет. Числа будут одинаковые в обоих случаях.


        1. Turbo
          11.04.2017 10:51
          +2

          Если обсуждается «визуальное» качество, то это уже сжатие с потерями и в данном тесте программы для lossy сжатия не рассматривались.


        1. f1inx
          11.04.2017 12:14
          +1

          Замечание.

          Оптимизация JPEG происходит за счет построения оптимальной таблицы Хаффмана вместо таблицы по умолчанию, применяющейся большинством JPEG кодировщиками по известному алгоритму (типичный выигрыш ~20% объема) перед Хаффманом есть еще стадия RLE (run length encoding), которую теоретически можно немножко подстроить под последующий Хаффман и выиграть доли процентов на которые в общем-то и отличаются оптимизаторы.

          А вовсе не за счет подбора параметров компрессии которая для JPEG это изменение коэффициентов таблицы квантования, любое уменьшение которых ведет к потере качества, либо никак не сказывается на размере картинки, если уменьшают коэффициент для отсутствующих частот после FDCT.

          Оптимизация PNG происходит за счет более умного упаковщика LZ77 который по сути находит и кладет в словарь более длинные и более часто встречающиеся цепочки входных «символов».

          Здесь действительно возможен вариант подбора настроек для DEFLATE (LZ77+Хаффман) алгоритма типа размера словаря и окна, но это дает слабый выигрыш.


          1. caway
            11.04.2017 20:31

            Насколько мне известно, в JPEG не используется RLE.


            1. DistortNeo
              11.04.2017 22:37

              Насколько мне известно, в JPEG не используется RLE.

              В JPEG используется RLE для кодирования последовательности нулей.


              1. caway
                11.04.2017 22:45

                В JPEG используется RLE для кодирования последовательности нулей.
                На какой стадии это происходит?


                1. DistortNeo
                  11.04.2017 22:48

                  Описание формата JPEG:
                  http://lib.mdp.ac.id/ebook/Karya%20Umum/Compressed-Image-File-Formats.pdf
                  глава 8


          1. DistortNeo
            11.04.2017 22:40

            перед Хаффманом есть еще стадия RLE (run length encoding), которую теоретически можно немножко подстроить под последующий Хаффман

            А как? Хаффманом кодируется последовательность байт, каждый из которых имеет вид (bit_count:4, skip_zero_before:4). Где skip_zero_before — количество нулевых элементов перед текущим коэффициентом, bit_count — разрядность последующего ненулевого элемента. При этом построение этой последовательности однозначно и не может быть изменено в угоду Хаффману.


      1. KVL01
        11.04.2017 15:29

        Не то чтобы потеря качества, но неприятно вышло:

        PNGOUT может снизить глубину цвета, если при этом не теряется информация. Он мне наделал PNG с палитрой, но и альфаканал сохранил. Пока я разобрался, что картинки не запороты, а просто «необычные», пока нашёл софт, который их может корректно открыть, пока попересохранял всё…


    1. caway
      10.04.2017 20:51
      +1

      Они оптимизируют таблицы типа Huffman, удаляют всякую текстовую информацию и т.п…


      1. merlin-vrn
        11.04.2017 10:22
        +1

        В случае с PNG они используют ещё один важный ресурс — фильтры. Собственно говоря, это и есть основной задействуемый ресурс, если мы говорим об оптимизации png.


  1. Xalium
    11.04.2017 05:21

    попробовал потестить pingo — валится с появлением виндового окна «Прекращена работы программы pingo.exe».
    В чем может быть проблема?

    P.S.
    Win 7 x64
    pingo v0.79f
    При запуске без параметров не валится.


  1. icoz
    11.04.2017 07:13

    А где же Lepton для jpeg?


    1. onyxmaster
      11.04.2017 10:22

      Lepton всё-таки не производит файлы, пригодные для непосредственного использования, только для хранения, поэтому его отсутствие мне кажется естественным, а вот Guetzli (о котором уже написали ниже) очень хотелось бы увидеть.


  1. Shedal
    11.04.2017 10:09
    +1

    А как же знаменитый Guetzli, достигающий до 35% меньшего размера файла без потери качества?

    https://research.googleblog.com/2017/03/announcing-guetzli-new-open-source-jpeg.html


    1. Turbo
      11.04.2017 10:34
      +3

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


  1. merlin-vrn
    11.04.2017 10:26

    leanify у меня сегфолтится на одном из файлов. Стоит попробовать этот файл на ваш сервис загрузить?


    1. Turbo
      11.04.2017 10:35

      Лучше сюда в комменты скинуть.


      1. merlin-vrn
        11.04.2017 11:45

        Ну, если хабр не пережмёт в jpeg или что-нить подобное не сделает с ним…

        поле для игры Адмирал (280k, 14166x11918 px)


        1. Turbo
          11.04.2017 13:53

          Всё ок сконвертилось, правда ушло 7 минут на это:
          Optimization complete. Download image (~233 KB) Reduction is 15.09 %
          http://lossless-image-optimization.com/dl.php?f=20170411134309-a427f41f97

          Проблема может быть с огромным разрешением файла.


          1. merlin-vrn
            11.04.2017 14:11

            Да, я тоже думаю, что это разрешение. Я брал их официальный бинарник linux x86_64, и он сегфолтится где-то через секунду после старта с полностью дефолтными опциями.


  1. saluev
    11.04.2017 17:13

    Как насчёт сделать график на плоскости, с точками, соответствующими программам (ось x — скорость, ось y — сжатие)?


  1. justhabrauser
    11.04.2017 18:03
    +1

    <зануда>
    Неплохо было бы указывать ОС, на которой/ых тестировалось.
    А если указаны ОС, на которых эти программы могут работать — вообще будет корректно.
    Если «Default OS» — то в теги лучше добавить «Windows»
    </зануда>


    1. Turbo
      11.04.2017 18:55

      Да, тестировалось на Windows 10 (x64), i7 — 4930K, 32gb ram. Всё где плюсик в графе Open Source соберется на Linux. не работает под Linux только 3: Pingo, pinga и TRUEpng.

      Добавил в текст.