JPEG XL

JPEG XL is a royalty-free raster-graphics file format that supports both lossy and lossless compression. It is designed to outperform existing raster formats and thus become their universal replacement.

Name
The name consists of JPEG (for the Joint Photographic Experts Group, which is the committee which designed the format), X (part of the name of several JPEG standards since 2000: JPEG XT, JPEG XR, JPEG XS), and L (for long-term). The L was included because the authors' intention is for the format to replace the legacy JPEG and last just as long, too.

Authors
The main authors of the specification are Jyrki Alakuijala, Jon Sneyers, and Luca Versari. Other collaborators are Sami Boukortt, Alex Deymo, Moritz Firsching, Thomas Fischbacher, Eugene Kliuchnikov, Robert Obryk, Alexander Rhatushnyak, Zoltan Szabadka, Lode Vandevenne, and Jan Wassenberg.

History
In August 2017, JTC1 / SC29 / WG1 (JPEG) published a call for proposals for JPEG XL, the next generation image encoding standard. The proposals were submitted by September 2018, leading to a committee draft in July 2019. It was mainly based on a combination of a proposal called PIK, submitted by Google, and a proposal called FUIF — itself based on FLIF — submitted by Cloudinary.

The bitstream was informally frozen on 24 December 2020 with the release of version 0.2 of the libjxl reference software. The file format and core coding system were formally standardized on 13 October 2021 and 30 March 2022 respectively.

Description
The JPEG XL call for proposals talks about the requirement of a next generation image compression standard with substantially better compression efficiency (60% improvement) comparing to JPEG. The standard is expected to outperform the still image compression performance shown by HEIC, AVIF, WebP, and JPEG 2000. It also provides efficient lossless recompression options for images in the traditional/legacy JPEG format.

JPEG XL supports lossy compression and lossless compression of ultra-high-resolution images (up to 1 terapixel), up to 32 bits per component, up to 4099 components (including alpha transparency), animated images, and embedded previews. It has features aimed at web delivery such as advanced progressive decoding and minimal header overhead, as well as features aimed at image editing and digital printing, such as support for multiple layers, CMYK, and spot colors. It is specifically designed to seamlessly handle wide color gamut color spaces with high dynamic range such as Rec. 2100 with the PQ or HLG transfer function.

Features
The main features are:


 * Image dimensions of over a billion (230−1) pixels on each side.
 * Up to 4099 channels. Main channels: either one channel for grayscale, three channels for RGB, or four channels for CMYK. The rest of the channels are optional and can be used to store alpha (either "straight" or "premultiplied"), depth, or thermal data.
 * There can be multiple frames, with non-zero duration (for animation) or with zero duration (making them work more like layers in graphics software). Frames can be smaller or larger than the image canvas and can be blended in various ways. However, regular video codecs are still preferred for encoding realistic content.
 * Independent tiles: Decoding of sections of a large image by allowing images to be stored in tiles.
 * Progressive decoding: Mode specifically designed for responsive loading of large images depending on the viewing device's resolution.
 * Reversible JPEG transcoding: ~20% size reduction can be achieved.
 * Lossless encoding for any channel, including alpha.
 * Support for both photographic and synthetic imagery: The format features two complementary modes that can be used depending on the image contents.
 * Graceful quality degradation across a large range of bitrates: Quality loss isn't as abrupt as with older formats.
 * Perceptually optimized reference encoder which uses a perceptual color space, adaptive quantization, and conservative default settings.
 * Support for wide color gamut and HDR: JPEG XL has built-in support for various color spaces, transfer curves, and high screen brightness.
 * Efficient encoding and decoding without requiring specialized hardware: JPEG XL is about as fast to encode and decode as old JPEG using libjpeg-turbo and an order of magnitude faster to encode and decode compared to HEIC with x265. It is also parallelizable.
 * Royalty-free format with an open-source reference implementation available on GitHub under a 3-clause BSD license.

Technical details


JPEG XL is based on ideas from Google's PIK format and Cloudinary's FUIF format (which was in turn based on FLIF).

The format is mainly based on two encoding modes: Any additional/extra channels (e.g. alpha, depth, thermal, spot colors, etc.) are always encoded in the modular mode. It was based on FUIF, combined with elements of lossless PIK, lossless WebP, and new ideas that have been developed during the collaborative phase of the standardization process. Modular mode allows lossy compression with the help of the modified Haar transform called "squeeze" which has progressive properties, quality of the image increases with the amount of data loaded.
 * VarDCT mode (variable-blocksize DCT) – it is based from the same DCT algorithm as legacy JPEG, but blocks, instead of being restricted to 8×8, come in various sizes (2×2 up to 256×256), non-square shapes (e.g. 16×8, 8×32, 32×64), or can use another transforms (AFV, Hornuss). It is only used for the 3 color channels, which typically use the XYB color space (although YCbCr is also supported in order to recompress legacy JPEG). The VarDCT mode is based on (lossy) PIK. Lossy modes typically use the XYB color space derived from LMS.
 * Modular mode is responsible, among other things, for efficient lossless content encoding and also for lossy and near-lossless purposes. Modular can also be used internally in VarDCT to save 2D data, i.e. everything except the AC (high-frequency) DCT coefficients, including the DC image (which is always a 1:8 subsampled image so also includes low-frequency AC coefficients in case block sizes larger than 8×8 are used), the weights of adaptive quantization and filter strengths.

One of the ways VarDCT-based images can be loaded more progressively is by saving the DC coefficients in a separate "DC frame" that uses modular squeeze: allowing previews corresponding to 1:16, 1:32 etc subsampled images. A squeeze transform can also be used to encode the alpha channel progressively together with VarDCT-encoded color channels, making both modes work in tandem.

JPEG XL defaults to a visually near-lossless setting that still provides good compression.

These modes can be assisted by separate modeling of specific image features called:
 * Splines for coding e.g. hairs (not yet used by the reference encoder).
 * Repeating "patches" like text, dots, or sprites.
 * Noise synthesis: since noise is hard to compress, it is better to separate it out and then regenerate it in the decoder. This is similar to film grain synthesis in modern video codecs like AV1, although JPEG XL's noise synthesis is not aiming to mimick the granularity of analog photographic film, but rather to model the photon noise at the pixel level, i.e. those visible with a digital camera at high ISO settings.

JPEG XL codec can losslessly transcode a widely-supported subset of JPEG files, by directly copying JPEG's DCT block coefficients to 8×8 VarDCT blocks, making smaller file sizes possible due to JPEG XL's superior entropy coding. This process is reversible and it allows for the original JPEG file to be reconstructed bit-for-bit, although constraints limit support for some files.

Prediction is run using a pixel-by-pixel decorrelator without side information, including a parameterized self-correcting weighted ensemble of predictors. Context modeling includes specialized static models and powerful meta-adaptive models that take local error into account, with a signaled tree structure and predictor selection per context. Entropy coding is LZ77-enabled and can use either asymmetric numeral systems or Prefix codes (useful for low-complexity encoders, or reducing the overhead of short streams).

Animated (multi-frame) images do not perform advanced inter-frame prediction, though some rudimentary inter-frame coding tools are available:
 * Frames can be smaller than the full canvas size, leaving other pixels untouched.
 * Frames support several blending modes in addition to replacing previous frames, such as addition or multiplication.
 * Up to four frames can be remembered and referenced by later frames, using the "patches" coding tool.

Industry support and adoption
Besides Cloudinary, throughout JPEG XL's preliminary implementation in web browsers, various representatives of well-known industry brand names have publicly voiced support for JPEG XL as their preferred choice, including Facebook, Adobe,  Intel and the Video Electronics Standards Association,  The Guardian,  Flickr and SmugMug, Shopify, the Krita Foundation, and Serif Ltd.

Google's stance on JPEG XL is ambiguous, as it has contributed to the format but refrained from shipping an implementation of it in Chromium and Google Chrome. An extension to enable JPEG XL support in Chrome and Firefox became available in January 2024.

Codec implementations

 * JPEG XL Reference Software (libjxl)
 * license: New BSD License (previously Apache License 2.0)
 * contains (among others):
 * encode/decode library
 * encoder
 * decoder
 * fast lossless-only encoder
 * tool for benchmarking speed and quality of image codecs
 * GIMP and Gtk pixbuf plugin
 * J40: Independent, self-contained JPEG XL decoder
 * license: MIT License No Attribution
 * C99 single header library (no dependencies)
 * In Roman numerals, "XL" denotes 40, hence the name
 * libjxl-tiny: a simpler encoder implementation of JPEG XL, aimed at photographic images without an alpha channel.
 * license: New BSD License
 * jxlatte: Java JPEG XL decoder
 * license: MIT License
 * jxl_decode: A Python JPEG XL decoder.
 * license: MIT License
 * hydrium: Fast, ultra-low-memory, streaming JPEG XL encoder written in portable C.
 * license: BSD License
 * jxl-oxide: Small JPEG XL decoder written completely in Rust. Fully conforms to the specification.
 * dual license: MIT License and Apache License 2.0

Official software support

 * Apple Inc.
 * iOS/iPadOS 17 and later – system-wide reading including Files and Photos
 * macOS Sonoma (version 14) and later – reading on Finder and Preview
 * visionOS (presumed)
 * watchOS 10 and later
 * Safari 17 and later via the WebKit engine
 * Samsung
 * One UI in Samsung Galaxy S24 - storage capacity in Expert Raw
 * Tachiyomi 0.12.1 and later
 * Pale Moon v31.4.0 and later (v31.4.1 fixed wrong color of decoded JPEG XL images, v31.4.2 fixed JPEG-XL's transparency display for images with an alpha channel, and v32.0.0 support progressive decoding and animation for JPEG XL.)
 * ImageMagick – reading and writing of JPEG XL images
 * KDE applications can be built with KImageFormats plugin with native JPEG XL support. This gives most KDE apps native support for both read and writing and works with all apps from the Dolphin file manager including Gwenview image viewer, Krita digital painting tool and DigiKam photo manager.
 * XnView – reading and writing of JPEG XL images
 * Affinity suite - reading and writing of JPEG XL images
 * GNOME 45 and later
 * GTK via the GDK pixbuf plugin. Prior to 45, it wasn't supported officially.
 * Shell - used to store the default wallpapers.
 * Image Viewer via the Glycin image decoding library.
 * Epiphany via the WebKitGTK engine.
 * Digital Negative - since version 1.7.0.0, this raw image format allows image data contained within to be compressed using JPEG XL.

Unofficial or indirect support

 * Microsoft Windows – A 3rd-party Windows Imaging Component (WIC) plugin adds viewing to File Explorer, Microsoft Photos, Windows Photo Viewer, and thumbnails, and aware apps. Only On Windows 7/10.
 * Another Windows Imaging Component plugin, jxl-winthumb.
 * macOS (prior to 14.0 Sonoma) – via a standalone app and a plugin for Quick Look
 * Qt support can be added with the qt-jpegxl-image-plugin
 * jpeg-xl-encode: a PHP JPEG XL wrapper for the reference implementation.

Preliminary web browser support

 * Firefox web browser – introduced for testing in Firefox Nightly build

Support for JPEG XL in Chromium and Chrome web browsers was introduced for testing April 1, 2021 and removed on December 9, 2022 - with support removed in version 110. The Chrome team cited a lack of interest from the ecosystem, insufficient improvements, and a wish to focus on improving existing formats as reasons for removing JPEG XL support. The decision was met with opposition from the community, with many voicing support for JPEG XL on Chromium's bug tracker. Jon Sneyers, co-author of the JPEG XL spec, has questioned the conclusions drawn by the Chrome team, saying: "I think there has been an unfortunate misinterpretation of the data... which has unfortunately lead [sic] to an incorrect decision." The decision was also criticized by Greg Farough from the Free Software Foundation, who said it demonstrated Google's "disturbing amount of control" over the web and web browsers.

Rivals

 * AVIF - AV1 video codec in a HEIF container
 * HEIC - HEVC video codec in a HEIF container
 * WebP - VP8 video codec in a RIFF container