Назад к блогу

Chrome 155 декодирует JPEG XL: что стоит за возвращением формата

Chrome 155 декодирует JPEG XL: что стоит за возвращением формата

Chrome 155 впервые декодирует JPEG XL без флагов — и это не просто возвращение забытого формата, а смена самой архитектуры декодера на Rust ради безопасности памяти. Разбираем, почему Google и Mozilla годами ждали именно такой реализации, как это связано с Interop 2026 и что теперь делать с `.jxl` в реальных проектах.

Chrome начинает поставлять поддержку декодирования изображений в формате JPEG XL (.jxl) начиная с версии Chrome 155. Анонс опубликован 6 октября 2026 года. Речь идёт именно о декодировании: браузер распознаёт и отображает .jxl штатно, без отдельного флага. Поддержки кодирования в анонсе нет.

Что именно изменилось

Chrome поставляет поддержку декодирования JPEG XL начиная с версии 155. Это значит, что .jxl-изображения и анимации можно использовать в пайплайнах напрямую. Разработчикам, создателям контента и владельцам платформ предлагается начать применять .jxl в своих пайплайнах.

Для декодирования в Chrome интегрирована jxl-rs — чистая реализация декодера JPEG XL на Rust.

Почему декодер переписали на Rust

декодер изображений — одна из самых критичных и атакуемых поверхностей в браузере: он обрабатывает сложные недоверенные бинарные структуры прямо из сети и работает внутри процесса рендерера. Исторически декодеры на небезопасных для памяти языках, таких как C++, были подвержены уязвимостям вроде чтения за границами, переполнения кучи и использования после освобождения.

Модель безопасности Chrome опирается на песочницу и глубокую защиту по правилу двух, но песочница — лишь вторичный слой защиты. Чтобы устранить риски у источника, и был интегрирован jxl-rs.

Скорость при этом оставалась требованием. Чтобы безопасно задействовать SIMD, потребовалось стабилизировать функцию Rust target_feature_11, которая позволяет включать такие инструкции для отдельной функции, не помечая её как небезопасную. Затем был создан слой абстракции SIMD jxl_simd по образцу библиотеки C++ Highway. В итоге небезопасные операции ограничили небольшим числом тщательно проверенных мест, а проверка методами фаззинга и ИИ-ревью кода не выявила ошибок безопасности памяти за всю историю реализации.

Предыстория

Решение о поставке JPEG XL в Chrome основано на постоянных отзывах и запросах веб-разработчиков. Google и Mozilla откладывали поддержку до появления жизнеспособной альтернативы на Rust: «I think this validates Google's and Mozilla's decision to hold off until there's a viable Rust alternative». Это относится к задержке, а не к удалению.

Как на это повлиял Interop

Наиболее заметно запросы разработчиков проявились в Interop Process: формат был популярным предложением в 2026 году и за несколько лет до этого. Чтобы обеспечить совместимость между браузерами, команда Chrome участвовала в Interop 2026 JPEG XL Investigation — добиваясь тестового покрытия всех возможностей JPEG XL в браузерах и прохождения этих тестов в Chrome. Помимо этого команда учитывает отзывы из багов, опросов и Developer Signals Project.

Что это меняет на практике

В Chrome 155 изображения .jxl можно использовать напрямую. Но поддержка в других браузерах различается:

  • Chromium — за флагом с версии 91 по 109;
  • Firefox — за флагом с версии 90;
  • Edge — за флагом с версии 91;
  • Opera — за флагом с версии 77;
  • Safari — с версии 17;
  • Waterfox — включён по умолчанию.

Поэтому <img src="*.jxl"> без полифилов и фолбэков работает не везде — только там, где браузер декодирует .jxl штатно. В целом рекомендуется пробовать и AVIF, и JPEG XL, чтобы получить лучший результат.

Инструменты кодирования

Для кодирования исходного изображения в JPEG XL с настройками по умолчанию используется cjxl, для декодирования — djxl. Настройки кодирования выбираются параметрами. --distance задаёт желаемую визуальную точность в единицах just-noticeable differences, где 0 — lossless, а наиболее полезный lossy-диапазон — 0.5 .. 3.0. --quality задаёт шкалу от 0 до 100, примерно соответствующую libjpeg. --effort выбирает усилие кодирования. Дополнительные настройки доступны через cjxl --help или полный список через cjxl -v -v --help.

Цифры

Типичный коэффициент сжатия JPEG XL — 20:1 — 50:1.

Ограничения и открытые вопросы

Авторы признают ряд незавершённых частей реализации. LF-кадры для дополнительных каналов ещё не реализованы: при наличии alpha уровень 1 не рендерится, а уровень 2 портит изображение, поэтому при дополнительных каналах прогрессивный DC принудительно отключается.

Быстрый lossless-режим не применяется в ряде случаев: при анимации, кропе, если выбрана не самая быстрая ступень усилия кодирования, при кастомной битовой глубине, отличной от битовой глубины метаданных, при непустом имени кадра, при битовой глубине больше 16, а также при дополнительных каналах, кроме ровно одного alpha.

Для photon noise нет настройки 8 значений параметров синтеза на кадр — это ограничивает тонкий контроль. В размытии невидимых пикселей текущая реализация даёт размытие вниз и лишь дублирование края вверх на 1 пиксель; по замечанию авторов, лучше было бы размывать во всех направлениях, но это требует alpha-взвешенной свёртки с достаточно большим ядром.

Источники

Похожее