Формат изображений JPEG появился ещё в конце прошлого века, причём актуальность он не теряет, а, наоборот, набирает. Казалось бы, что можно изменить в технологии, которой столько лет? В Google посчитали, что сейчас самое время для оптимизации формата, а именно повышения эффективности компрессии. Что предложили в Google и как работает новая технология?

JPEG и разработка корпорации

В Google предложили новую библиотеку для кодирования изображений в формате JPEG, о чём компания и сообщила в своём блоге. Называется новинка Jpegli, и, по словам её создателей, она обеспечивает до 35% более высокую степень сжатия относительно традиционных кодеков. При этом качество изображений будет хорошим, плюс сохраняется обратная совместимость с технологиями, которые использовались ранее.

По мнению корпорации, если файлы JPEG облегчить, то это даст лишь плюсы — как пользователям, так и компаниям. Что касается первых, то они получат более быструю загрузку веб-страниц, насыщенных графикой. Ну а вторые смогут оптимальнее использовать объём файловых хранилищ, также, возможно, снизится объём передаваемых по сети данных. Конечно, это будет возможно лишь при условии массового применения библиотеки.

Стоит напомнить, что у JPEG несколько преимуществ, которые и дали возможность формату существовать и быть актуальным много лет подряд. Дело в том, что при сжатии файла можно управлять уровнем качества, что даёт возможность гибко реагировать на решение разных задач. Кроме того, JPEG поддерживает и технологию EXIF, позволяющую хранить важные метаданные. Ну а совместимы с этим форматом практически все графические редакторы — как известные, так и пет-проекты с единицами пользователей.

Новый проект Google, по словам авторов, даёт возможность снизить шумы и в целом улучшить качество изображения. Одна из задействованных технологий — эвристика квантования, которая применяется JPEG XL. А ещё применялись оптимизированные алгоритмы выбора матриц квантования и вычисления промежуточных результатов. Также авторы библиотеки добавили более совершенные цветовые пространства.

Работа с Jpegli не создаёт никаких проблем, поскольку изображения, отредактированные или созданные с использованием этой библиотеки, совместимы с любыми технологиями, с которыми имеет совместимость и формат JPEG. Соответственно, такие «картинки» можно отображать на веб-страницах, работать с ними в графических редакторах, просматривать в любых других программах.

Что ещё?

По словам представителей Google, с библиотекой поставляются как кодер, так и декодер. Они соответствуют всем стандартам JPEG, а также обратно совместимы с libjpeg-turbo и MozJPEG.

libjpeg-turbo — высокопроизводительная библиотека для кодирования и декодирования изображений в формате JPEG. Libjpeg-turbo представляет собой совместимый на уровне API/ABI форк классической библиотеки libjpeg, нацеленный на обеспечение максимальной скорости обработки изображений.

MozJPEG — проект Mozilla, стартовавший в 2014 году. Его цель — создание качественного кодера JPEG, который улучшит сжатие изображений при сохранении совместимости с существующими декодерами.

По мнению Google, новая библиотека даёт возможность получать более качественные изображения на выходе после сжатия по сравнению с подавляющим большинством существующих решений. Результат выглядит более чётким и визуально: на картинке сложно обнаружить видимые проблемы. Всё это возможно благодаря задействованию целого комплекса современных технологий.

Кроме качества, ещё одно достоинство библиотеки — более быстрое выполнение операций кодирования и декодирования. По этому параметру новое решение идёт вровень или обгоняет существующие технологии. Соответственно, веб-разработчики могут без проблем интегрировать Jpegli в свои существующие рабочие процессы, не жертвуя производительностью кодирования или использованием памяти.

Jpegli может быть закодирован с использованием более 10 бит на компонент. Традиционные решения для кодирования JPEG предлагают только 8-битную кодировку на компонент, что приводит к видимым артефактам полос в медленных градиентах. 10-битное кодирование и кодирование с большей битностью в Jpegli происходит в исходном 8-битном формализме, и полученные изображения полностью совместимы с 8-битными программами просмотра. 10-битная динамика доступна в виде расширения API, и для её использования необходимо внести изменения в код приложения.

Немного тестов

Для того чтобы не быть голословными, разработчики из Google провели несколько тестов. Так, они упаковали в JPEG-файлы датасет изображений компании Cloudinary с использованием Jpegli, libjpeg-turbo и MozJPEG. При этом изображения представлены несколькими копиями с разным битрейтом.

Группу пользователей (не из Google, их привлекли при помощи различных сервисов) просили сравнивать пары изображений, полученные посредством работы с разными кодеками (Jpegli, libjpeg-turbo и MozJPEG), с тем чтобы выбирать самые качественные.

На диаграмме выше показаны результаты тестирования. Для их выведения применялся метод Эло.

Библиотека jpegli написана на языке C++ и распространяется под лицензией BSD, обеспечивая свободное использование и модификацию кода. Она полностью совместима на уровне API и ABI с libjpeg62. Вот ссылка на саму библиотеку.

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


  1. NickDoom
    08.04.2024 15:04
    +13

    То есть они наконец воспользовались заложенной в стандарт возможностью хранить кастомную таблицу квантования, а не просто «стандарт × коэффициент»? Похвально. Я, помнится, пытался подобрать таблицы для хорошего сжатия линий (чтобы не обрастали «звоном»), в ущерб градиентам. Фигня получилась, конечно :) Но я и не Гугль :)

    А ещё можно, при повторном сжатии уже некогда сжатого изображения, пытаться угадать его «тогдашнюю» таблицу квантования. Ну, и сами квантованные значения в тех местах, где не было редактирования. Это не только предотвратит «цифровой износ», но ещё и «здесь и сейчас» улучшит соотношение «качество/размер».


    1. jpegqs
      08.04.2024 15:04
      +2

      MozJPEG делали то же самое, подбирали оптимальную таблицу квантования.


    1. wmlab
      08.04.2024 15:04
      +9

      Я очень давно пытался сделать свой "самый лучший" архиватор, который подбирал кодирование Хаффмана для каждого файла индивидуально, а не использовал бы стандартную статистическую таблицу. Он даже работал. Но никому он оказался не нужен. Дежавю.


      1. Porohovnik
        08.04.2024 15:04
        +1

        Вы проводили сравнению с другими решениями?

        И на сколько подбор кодирования замедлял архивирование?


      1. ef_end_y
        08.04.2024 15:04
        +1

        Вы что-то путаете. Статический хаффман использовался сто лет назад и только в случае если нужно было сжать быстро - например, в драйвере прозрачного сжатия диска. Везде применяется динамический


        1. wmlab
          08.04.2024 15:04
          +2

          Это было в начале девяностых. DOS, зоопарк архиваторов (помню ARJ). Я только прочитал про Хаффмана и LZW, и написал свою реализацию двухпроходного сжатия на плюсах. Уже и забыл про это. Вспомнил потому, что упомянули динамическое квантование в JPEG.


      1. CodeName33
        08.04.2024 15:04
        +1

        Лет в 16-17 я тоже пытался сделать более эффективный формат GIF, чтобы и TrueColor и лучшее сжатие, более умный поиск изменений в кадрах (короче почти повторил оказавшийся никому не нужным APNG, за исключением того, что про APNG хотя бы кто-то слышал)) Но на тот момент, я еще не понимал как устроен мир и когда я закончил пару месяцев ощущал себя мини Стивом Джобсом, кем-то кто изобрел что-то новое, чего не было раньше. Какое-то время даже пытался убедить друзей использовать это и размещать в бесплатных каталогах софта. А потом пришло осознание, что ничего я не изобрел, то, что сделал я, может сделать любой хороший программист, но не делает не потому, что не может, а потому, что это никому не надо) Точнее не так, это надо всем, но ты не заставишь всех этим пользоваться, пока этим не пользуются все) А это про большие деньги, а не про то, что ты на коленке что-то слепил, чуть более эффективное, чем текущий стандарт (в основном за счет того, что стандарту дохрена лет и с тех пор появились алгоритмы получше) и кричишь "Я сделаль!".

        Но здесь не та ситуация, тут есть обратная совместимость, а значит, скорее всего взлетит со временем.


        1. sleirsgoevy
          08.04.2024 15:04
          +2

          Прошу заметить: судя по вашему комментарию, вы не просто "пытались" сделать формат более эффективным, чем существующие, но и в этом вполне преуспели. Вопрос лишь в том, что этот результат вряд ли кто-то увидит, кроме вас и ваших друзей.

          А вот как сделать, чтобы заметили — интересный вопрос. У тех же MLщиков есть небезызвестный Kaggle, где они меряются крутостью своих моделек, минимизируя лоссы на датасете. Применительно к архиваторам, есть, например, вот такой рейтинг архиваторов по качеству сжатия ими дампа англоязычной Википедии. Рейтинг открытый и обновляется, если у вас есть архиватор, который сжимает лучше, его можно попробовать туда отправить. Для сжатия картинок я сходу аналогичной таблицы не нашёл, но, возможно, она тоже существует.

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


          1. DBalashov
            08.04.2024 15:04

            Там надо внимательно смотреть на цифры.

            Например, WinRAR (на 76-й строке рейтинга) жмёт на 40% хуже топового nncp, но тратит в 470 раз меньше времени на сжатие/распаковку (колонка ns/byte) и почти в 60 раз меньше памяти. И тут вопрос - стоит ли оно того?

            Но да, есть и приличные архиваторы которые жмут лучше условного rar - по таблице какойнить mcm со сравнимыми характеристиками времени (но опять же ценой потребления памяти), но на 28% лучше rar. И опять же вопрос - стоит ли оно того?


            1. KvanTTT
              08.04.2024 15:04

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


      1. UncleSam27
        08.04.2024 15:04
        +1

        Вы шутите? Я вообще не помню, чтобы в современных архиваторах использовались готовые статистические таблицы. Да собствено лабораторная работа в институте по кодированию Хаффмана хрен знает сколько лет назад, состояла как раз в том, чтобы проанализировать файл, создать персональную таблицу статистики и зашифровать файл с сохранением этой таблицы.


        1. ef_end_y
          08.04.2024 15:04

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


  1. KvanTTT
    08.04.2024 15:04

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


    1. wmlab
      08.04.2024 15:04
      +14

      Если можно улучшить "легаси", не жертвуя совместимостью и ресурсами - почему нет? А JPEG XL по всем тестам лучше WEBP, но совместимости нет и поддерживается вяло. Как IPv6 супротив IPv4.


      1. NickDoom
        08.04.2024 15:04
        +29

        Надо будет мне собраться с яйцами, добить исследование и выдать на-гора статью о сжатии жпегом в 3D (то есть не квадрат 8х8, а куб 8х8х8). Там получился (не у меня первого, но у меня тоже получился, кек) неплохой видеокодек, в котором корреляция «между кадрами» не требует отдельно никакие области движений, смещений (и так далее) высчитывать — они там получаются нативно, «просто потому, что». И жмёт он — держите меня семеро.

        Я это рассматривал как расширение (внезапно) стандарта GIF — новый тип кадра для анимации, в котором вместо одного кадра лежат сразу 8. Все остальные опции, типа заголовка с длительностью — оставляем стандартные анигифовские. Ну, и пара новых служебных форматов чанка потребуется — таблицы Хаффмана и квантования сами себя не загрузят.

        А главную проблему, связанную с тем, что количество умножений там не квадратичное, а кубичное, я разрешил очень просто, без всяких группировок «бабочкой» и как там вообще обычно это до меня пытались делать: поскольку 95% величин квантуются в ноль (а иначе зачем бы было вообще такое сжатие, как не ради его эффективности?), я просто в 95% случаев перехожу в continue; :-)

        И всё у меня в реалтайме на одном ядре сразу стало летать… ларчик просто откр оптимизировался :-D


        1. sim31r
          08.04.2024 15:04
          +1

          Получится какой-то MegaMjpeg ))


          1. NickDoom
            08.04.2024 15:04
            +1

            Ага, МЖпег на стероидах :)


        1. ZirakZigil
          08.04.2024 15:04
          +4

          Такое мы ждём. А какие-нибудь предварительные результаты где-нибудь есть? Хотя бы на уровне пары картинок и словестного описания "жалось за столько-то времени, сжалось во столько-то раз."


          1. NickDoom
            08.04.2024 15:04
            +3

            Попробую выжать что-то из рабочих папок…


        1. Houl
          08.04.2024 15:04

          Ждём статьи.


      1. MountainGoat
        08.04.2024 15:04
        +1

        А по патентам у JPEG что сейчас? Открыли, или по прежнему теоретически всем, кто им пользуется, могут приказать отбашлять?


        1. Melirius
          08.04.2024 15:04
          +1

          Истекли все.


    1. ExternalWayfarer
      08.04.2024 15:04
      +3

      Пока это легаси поддерживается всем, чем только можно, а совершенный WebP примерно ничем, то пусть пытаются.


      1. pae174
        08.04.2024 15:04
        +5

        1. ImagineTables
          08.04.2024 15:04
          +1

          Моя версия Фотошопа не поддерживает. И про неё не написано на caniuse.


        1. vanxant
          08.04.2024 15:04

          WebP пока почти исключительно только в вебе. И это хорошо, биороботам сложнее тырить картинки методом копипасты.


          1. Trase1
            08.04.2024 15:04

            В большинстве задач, биороботу мне, для этого хватает скриншота)


        1. Alexufo
          08.04.2024 15:04
          +1

          Power point , word?


        1. nidalee
          08.04.2024 15:04
          +1

          К остальным комментариям добавлю, что кроме вялой поддержки в софте у WEBP еще и вялая поддержка в сервисах. Залить WEBP можно не везде. На habrastorage, например, нельзя:

          Доступные расширения: jpg, gif, png; ширина до 5000px; максимальный размер до 8 Мбайт

          Таких сайтов все еще большинство. WEBP хорош отдавать статику на сайтах. Для личного использования он неудобен, посему у меня стоит "Don't "Accept" image/webp" :)


        1. Zara6502
          08.04.2024 15:04

          Два месяца назад купил пару новых МФУ, Epson и Canon, сканируют только в то, во что сканировали все 15 лет назад, а печатают только JPG из своего софта.


      1. masai
        08.04.2024 15:04
        +4

        Он далеко не совершенный. По всем параметрам и списку возможностей проигрывает JPEG XL, который Google упрямо не хочет реализовывать в Chrome.


        1. ExternalWayfarer
          08.04.2024 15:04
          +1

          В моем комментарии "совершенный" это сарказм)


    1. moscowman
      08.04.2024 15:04

      Знаете, если я на каком то сайте не напрягаясь вижу артефакты JPEG, то почти в 100% случаях это означает, что на картинка в формате WEBP.
      Так что либо это формат используют неверно, либо не такой уж он и хороший.


  1. Aquahawk
    08.04.2024 15:04
    +2

    Прошлый раз гугл пытался улучшить deflate сжатие при помощи zopfli, получилось немного улучшить ценой огромных затрат cpu, в итоге brotli победил, а потом пришел zstd и ещё раз победил, причем zstd уже в канареечном хроме завезли и скоро его можно будет в интернете использовать


    1. pae174
      08.04.2024 15:04

      причем zstd уже в канареечном хроме завезли и скоро его можно будет в интернете использовать

      Его уже можно использовать.


      1. A4E
        08.04.2024 15:04
        +1

        Ну то есть пользователей Safari и Firefox можно не учитывать, вы считаете?


        1. profesor08
          08.04.2024 15:04
          +1

          У них отработает brotli или gzip


        1. pae174
          08.04.2024 15:04

          Алгоритмы сжатия опциональны. То есть браузер передает серверу список поддерживаемых алгоритмов а сервер, просмотрев этот список, может использовать один из этих алгоритмов и отдать браузеру сжатый контент вместе с заголовком, который указывает на использованный алгоритм. Таким образом если на стороне сервера какой-то новый модный алгоритм уже применяется а на стороне браузера еще нет, то ничего не сломается.


    1. blind_oracle
      08.04.2024 15:04
      +1

      zopfli

      brotli

      jpegli

      Цюрихский офис гугла пошёл вразнос


    1. ornic
      08.04.2024 15:04

      в итоге brotli победил, а потом пришел zstd и ещё раз победил

      А есть тесты сравнительные про победу? Я не смог у себя (.net framework) сделать zstd одновременно быстрее и лучше чем brotli (и то и другое из коробки). По-видимому zstd надо сначала обучить, чего мне делать совсем не хотелось.


      1. Aquahawk
        08.04.2024 15:04

        https://community.centminmod.com/threads/round-4-compression-comparison-benchmarks-zstd-vs-brotli-vs-pigz-vs-bzip2-vs-xz-etc.18669/

        линия zstd выше и шире чем бротли. Мы применяем уже много где zstd в серверах (и сжатие в клике и сжатие логов), и по нашим сравнениям zstd нормально так выигрывает бротли, но мы сравнивали только нативные реализации, что в .net происходит с этим я не знаю. Может ещё конечно от данных зависеть, но чёрт его знает, пока везде я видел победу zstd.


        1. ornic
          08.04.2024 15:04

          https://news.ycombinator.com/item?id=27163981

          Я примерно аналогичное видел. Сейчас ситуация, возможно, изменилась. Но по факту получалось, что либо маленькие данные на бротли, либо большие (но там уже надо фигачить какой-нибудь бинарный протокол вместо джысона) на zstd с его многопоточным кодированием. Хотя многопоточное кодирование тоже палка о СPUcount концах - при массовой нагрузке на сервер ничего никто не выиграет от него.


  1. homm
    08.04.2024 15:04

    Попытался найти хоть какие-то примеры, скачал mucped23.zip, там зачем-то png файлы лежат вместо jpeg. И нет нигде размеров того что получилось (цифры q55 и q95 ничего не значат, размер может любой). Как-то всё очень мутно пока. Если все так круто, то почему нет примеров?


    1. homm
      08.04.2024 15:04

      Если что, способ существенно сократить размер jpeg без потери обратной совместимости действительно есть, работает только для retina-изображений.


  1. novoku
    08.04.2024 15:04

    Помнится в свое время Мелкий Софт тоже предлагал улучшенное сжатие картинок, но там бвл новый формат.Даже этому гиганту не удалось подвинуть популярный формат. Здесь же вроде все на мази...