Repository navigation
Releases
v0.13.0
Important note: this release contains multiple security fixes, including fix for severe vulnerability in dependency; please consider updating to this version - there are no breaking API changes for most scenarios compared to versions v0.11.x, v0.12.0
Security
- bumped brotli to v1.2.1 (#5062) to mitigate CVE-2026-111497
- sized low-memory render pipeline ring buffers by simulating the actual stage
schedule, fixing use-of-uninitialized-memory bugs with vertically subsampled
stages (#5022) - reset JPEG reconstruction state, fixing potential use-after-free writes across
decoder resets (#5029) - security and hardening fixes across the core decoder/encoder,
JPEG reconstruction, splines, and codec plugins (EXR, APNG, PGX, PNM); this
includes fixes for integer overflows in JPEG coefficient buffer allocations
and spline area budgets, out-of-bounds read/write guards in chunked frame
adapters and truncated EXR scanline streams, bounds-checkedSpan::subspan
slicing, and null pointer guards (#4936, #4938, #5009, #5022, #5023,
#5026, #5029, #5030, #5076, #5091, #5096, #5100) - decoder: more consistent image_out cleanup;
reported-by: Alejandro Pacheco (@alepacheco) and Eunji Ham - harden patch rect calculations;
reported-by: Robert McConnell and freezagent - make another decoding path aware of overflows (see #4808);
reported-by: Robert McConnell - decoder: guard against using wrong out buffer;
reported-by: Lakshit Verma - ensure CmsStage when converting CMYK has access to actual black channel;
reported-by: Marinko Ružić - fix using wrong subsampling when reconstructing gray JPEGs;
reported-by: synawk dsx, ptrstr and Lakshit Verma
Added
- encoder API: added
JXL_ENC_FRAME_SETTING_STRIP_ALPHAframe setting and
--strip_alphaCLI flag to control stripping of alpha channels on
single-frame images with a single extra channel (#4981, #4984) - encoder API: added
JXL_ENC_FRAME_SETTING_JPEG_RECON_LFSframe setting and
--jpeg_reconstruction_lfsCLI flag to control LF (adaptive DC) smoothing
during lossless JPEG recompression; allows non-444 transcoded JPEGs with
adaptive DC/LF smoothing to decode (#4932, #5031) - release & CI: added native Linux AArch64 static release artifacts (#5039),
Windows ARM64 CI build and release support (#4997), and GitHub artifact
attestation for published release assets (#4982)
Changed
- rewrote LZ77 implementation for lossless image compression (#4928)
- compression density & encoder improvements:
- enabled LF smoothing by default for 4:4:4 lossless JPEG transcoding (#4932)
- re-enabled squeezed delta palette (#4930)
- signaled the default 39-entry block context map, saving 22-23 bytes per
frame when using the default block context map (#5001) - improved histogram clustering with forced prefix codes (force_huffman) by
accounting for merges that turn a zero-cost single-symbol histogram into a
multi-symbol histogram (#5002) - modular encoder: skipped
EstimateWPCostweighted-predictor mode search
when a custom fixed tree is provided (#5003)
- performance & memory:
- tools:
jxl_from_treenow automatically uses 16-bit buffers when bit depth is
12 or less (#4976)
Fixed
- disabled adaptive DC smoothing during lossless JPEG reconstruction (#4931)
- cleared all patch dictionary state, preventing patches from being blended
using a previous frame's blend modes (#4989) - forgot extra channel output buffers in
JxlDecoderSkipCurrentFrame()(#5026) - reset
prog_detailonJxlDecoderReset()and rewind (#5121) - copied ANS lookup data from the containing entry in
InitAliasDistribution
and added compile-time size verification (#4952, #5069) - guarded PerformBlending against empty segments (#4992, #5068)
- fixed
Forward/MetaandInversesqueeze transform agreement on
hshift/vshift updates (#5116) - fixed luminance calculation and multiplicative factor in photon noise
synthesis (enc_photon_noise) (#5053) - scaled
center_xandcenter_ycoordinates bydc_scalefor LF frames when
encoding with center-first group ordering (#4969) - handled legacy non-conforming Display P3 v4 ICC profiles (#4965)
- fixed possible stream inconsistency in streaming encoding mode (#5115)
- fixed formal data races in
enc_cache.ccand modularFillSigma
initialization (#5102, #5109) - validated packed frame extra-channel counts before encoding (#5075)
- PNM/PAM decoder: rejected sample values exceeding
MaxVal(#5064) - PNG/APNG decoder: zeroed rows left undecoded by truncated PNGs (#5083)
- Gain Map API: avoided calling memcpy with a nullptr source (#5089)
- NumPy encoder: properly escaped frame names per RFC 8259 in
--metadata_out
JSON output (#5088) - extras: derived file extensions from the final path component only in
CodecFromPath. (#5081) - build & platform fixes:
- fixed build with Highway 1.3+ (#4906)
- dropped
-lmfromlibjxl_cms.pcandlibjxl_threads.pcpkg-config files
on MSVC (#5061) - fixed MSVC intrinsics include order so
_sub_overflow_i32is visible on
x86/x64 (#5071) - enabled
JXL_UNUSEDmacro under clang-cl (#5122) - checked whether
Qthas feature xcb before enabling xcb in tools/ CMake
build (#5019) - fixed mingw32 build (#4940) and sequentialized CMake test discovery to avoid
build races on macOS/multi-core machines (#4939)
Note: This release is for evaluation purposes and may contain bugs, including security bugs, that may not be individually documented when fixed. See the SECURITY.md file for details. Always prefer to use the latest release.
Please provide feedback and report bugs here.
v0.12.0
Added
- A new buffering flag is now available in the CLI, alongside support for
streaming input with buffered output. (#4634) - Introduced the new
jxltrantool, which supports extracting codestreams from
jxlpboxes and packing raw codestreams intojxlcboxes. (#4161, #4165,
#4168, #4196) - Added the
--reconstruct_jpegflag todjxlto losslessly reconstruct a
JPEG and fail if impossible (mutually exclusive with--pixels_to_jpegand
--jpeg_quality). (#4498) - Added
JXL_DEC_UNSUPPORTED(kUnsupported) status code to the core API to
better indicate when requested features or operations are not supported by
the decoder. (#4390) - tools: added support for
ProPhoto(#4824) andAdobe98/AdobeRGB
(#4199) color space names in CLI arguments (cjxl/djxl). - decoder API: support for out-of-order
jxlpboxes (ftyp minor version 1).
(#4741) - encoder API:
JXL_ENC_FRAME_SETTING_OUTPUT_MODEframe setting to control how
the codestream is written to the output. Mode 0 (default) buffers the output
internally and produces a normally ordered, progressively decodable
codestream. Mode 1 uses seek-based streaming (reduces peak memory for large
images, requires a seekable output stream). Mode 2 uses out-of-orderjxlp
boxes (reduces peak memory without requiring seeking, but requires a decoder
that supports ftyp minor version 1). (#4745)
Changed
- Major overhaul for faster decoding and progressive lossless. (#4201, #4641,
#4811)- Progressive lossless images are around 30-40% smaller and are now
multithreaded increasing encoding performance by 2-5x. - Lossless images with faster decoding are now 30-80% smaller and their
decoding speeds properly scale as the faster decoding level increases
from 1-4. - Disabled global palette for progressive images, fixing glitchy progressive
loading for indexed/low color images and restoring transparency support
(Note: this causes a density/speed penalty for very low bit-depth images).
- Progressive lossless images are around 30-40% smaller and are now
- Numerous speed/memory usage improvements.
- Improved encoding speeds by SIMDifying
EstimateCost(+5% performance) and
speeding up uint-coding trials. (#4322, #4330) - Accelerated modular encoding and decoding via SIMD optimizations for
forward RCT transforms and upsampling (up to 4x faster). (#4332, #4384) - Massive overhaul to histogram encoding and decoding, providing significant
performance optimizations for modular mode. (#4123, #4132, #4136, #4185) - Tweaked JPEG recompression logic to improve density and efficiency. (#4202)
- Fixed performance regressions in fast lossless modes and optimized
text-like patch detection. (#4341, #4448) - Refined x86
XCR0CPU checks to prevent issues on specific hardware.
(#4449) - Migrated Windows release builds to use
clang-cl, which improves
performance across the board. (#4529) - Improved use of SIMD in tree construction hot loop. (#4720)
- Improved spline caching. (#4857)
- Postponed JPEG coeffs allocation until first SOS. (#4863)
- Improved encoding speeds by SIMDifying
- The default buffering level in the CLI has been changed to
2, greatly
improving encoding performance for images under 2048x2048. Additionally,
output is buffered by default to allow basic progressive loading. (#4635,
#4637, #4642) - Better Density/Speed tradeoff for lossless effort levels. (#4236)
- Improved visual quality of gradients by using channel-offset blue noise
dithering instead of bayer when decoding to lower bitdepths. (#4305, #4559) - Lossy modular encoding quality/density improvements. (#3575)
local_tone_maptool: Now produces SDR output in theDisplayP3color space
rather thanRec2020. Also added an optional third command-line argument to
dump the HDR image as a rawrgba1010102file for use with thelibultrahdr
example app. (#4210)- Significant improvements to EXR input/output handling for cjxl. Now supports
reading float32, multilayer, per-channel bitdepth, and writing greyscale
EXR images. (#4312, #4460) - The decoder API for
JxlDecoderSetImageOutBufferand
JxlDecoderSetPreviewOutBufferhas been clarified; their timeframes are now
non-intersecting, preventing accidental buffer overwrites. (#4671) - Layered JXL files are no longer coalesced when re-encoding with cjxl, and
can now be decoded to separate PNG/PAM files with djxl by using
--no_coalescing. (#4299) - The progressive flag
-pin cjxl will now encode a more progressive image.
(#4258, #4699) - When lossy encoding, resampling 2 is now enabled at distance 10, and is up to
10x faster below effort 10 by using a faster downsampling method. (#4147) - Faster PNG compression. (#3819)
- decoder API: documented that at most one preview image exists in a
codestream.
(#4671) - encoder API: corrected documentation for box size header in
JxlEncoderAddBox(0 means box extends to end of file, 1 means 64-bit size
follows). (#4081) - Performance & memory: tracked memory for temporary box/codestream storage
(#4852) and reduced allocation overhead inValidateTree(#4851) and low
memory rendering pipeline. (#4495, #4496) - Quality: improved HDR behavior at effort 8+. (#3885)
- tools:
jxlinforewritten in C++ with human-friendly output formatting.
(#4300) - tools: image viewers now perform CMS color transforms in parallel across
threads. (#4326)
Deprecated
- encoder API:
JXL_ENC_FRAME_SETTING_BUFFERINGmode 3 is deprecated; output
buffering should now be controlled viaJXL_ENC_FRAME_SETTING_OUTPUT_MODE.
(#4745)
Removed
- The
jpeglicodebase has been removed as it is now maintained as a separate
project at google/jpegli. (#4657) - Dropped GIMP plugin (
libjxl-gimp-plugin). (#4875)
Fixed
- Allows -E to be used in jpeg-transcoding again. (#4729)
- Fixed an issue where Lossy Delta Palette encoding failed on images larger
than 2048x2048. (#4201) - Fixed Delta Palette with Weighted Predictor decoding. (#4837)
JxlEncoderAddChunkedFrameincorrectly calledJxlEncoderCloseInput
instead ofJxlEncoderCloseFrames, resulting in corrupted files when
trying to add more boxes. (#4466)- Float16 values roundtrip more accurately. (#4461)
- JXL input to cjxl no longer gets double orientation applied and also now
keeps frame names. (#4374, #4561) JxlBasicInfo.alpha_premultipliedwas not correctly forwarded. (#4357)- CMYK JXL files would not decode to PNG correctly. (#4301)
- Encoder would hang with specific parameters on images containing more than
256 groups. (#4302) - Decoding would fail with LZ77 runs that crossed entropy-coded streams within
the same section. (#4298) - Images could be corrupted when encoding effort 1 lossless. (#4027, #4291)
- Extremely high quality lossy would not conform to Level 5 of the spec.
(#4238) - Density regression with Predictor Zero since v0.11. (#4225)
- Progressive VarDCT encoding would create non-progressive files. (#4223)
- Extremely tall/wide images failed to encode using modular. (#3937, #4308)
- Empty DHT markers no longer cause JPEG transcoding to fail. (#2704)
- Fixed photon noise encoding for progressive images. (#4866)
- Correctly handled mistakenly set "interleaved" alpha. (#4862)
- Fixed grayscale over-read in
EncodeWithSJpeg. (#4871) - Fixed
djxlSelectFormatfailure when converting grayscale images to PPM.
(#4691) - Fixed segmentation fault when attempting to open non-existing input files in
CLI tools. (#4846) - Fixed GIF always being decoded as RGBA. (#4849)
- Added a warning when an unsupported GIF disposal mode is encountered. (#3918)
- Fixed PNG color space information reading. (#4598)
- Fixed MSVC ARM64 build and restricted
_sub_overflow_i32to x86/x64. (#4877) - Corrected specialized decoding path for fast lossless. (#4836)
- Rejected duplicate out-of-order
jxlpindices. (#4814) - Used
png_bit_depthto correctly determine pixel layout. (#4854) - Fixed memory leak in
GetContext()injxl_cms.cc. (#4663) - Fixed stdin evaluation if file
-exists. (#4668) - Fixed JXL primary color representation detection. (#4618)
Security
- Extensive security and hardening fixes across the core decoder/encoder, box
buffers, and plugins (EXR, GIF, APNG/PNG, PAM/PNM/PGX). This includes fixes
for integer overflows/underflows, out-of-bounds reads/writes, buffer
overflows, and null pointer guards. (#4629, #4631, #4646, #4683, #4685,
#4687, #4688, #4722, #4746, #4758, #4764, #4766, #4773, #4775, #4777,
#4778, #4788, #4791, #4792, #4795, #4797, #4799, #4808, #4839, #4840,
#4850, #4855, #4870, #4874)
Note: This release is for evaluation purposes and may contain bugs, including security bugs, that may not be individually documented when fixed. See the SECURITY.md file for details. Always prefer to use the latest release.
Please provide feedback and report bugs here.
v0.11.2
Fixed
- fix tile dimension in low memory rendering pipeline (#4495 -
CVE-2025-12474) - fix number of channels for gray-to-gray color transform (#4579 -
CVE-2026-1837) djxl: reject decoding JXL files if "packed" representation size overflows
size_t(#4589 - thanks to Mateusz Jurczyk of Google Project Zero for
identifying this issue)
Note: This release is for evaluation purposes and may contain bugs, including security bugs, that may not be individually documented when fixed. See the SECURITY.md file for details. Always prefer to use the latest release.
Please provide feedback and report bugs here.
v0.10.5
Fixed
- fix tile dimension in low memory rendering pipeline (#4495 -
CVE-2025-12474) - fix number of channels for gray-to-gray color transform (#4579 -
CVE-2026-1837) djxl: reject decoding JXL files if "packed" representation size overflows
size_t(#4589 - thanks to Mateusz Jurczyk of Google Project Zero for
identifying this issue)
Note: This release is for evaluation purposes and may contain bugs, including security bugs, that may not be individually documented when fixed. See the SECURITY.md file for details. Always prefer to use the latest release.
Please provide feedback and report bugs here.
v0.9.5
Fixed
- fix tile dimension in low memory rendering pipeline (#4495 -
CVE-2025-12474) - fix number of channels for gray-to-gray color transform (#4579 -
CVE-2026-1837) djxl: reject decoding JXL files if "packed" representation size overflows
size_t(#4589 - thanks to Mateusz Jurczyk of Google Project Zero for
identifying this issue)
Note: This release is for evaluation purposes and may contain bugs, including security bugs, that may not be individually documented when fixed. See the SECURITY.md file for details. Always prefer to use the latest release.
Please provide feedback and report bugs here.
v0.8.5
Fixed
- fix tile dimension in low memory rendering pipeline (#4495 -
CVE-2025-12474)
Note: This release is for evaluation purposes and may contain bugs, including security bugs, that may not be individually documented when fixed. See the SECURITY.md file for details. Always prefer to use the latest release.
Please provide feedback and report bugs here.
v0.7.3
Fixed
- fix tile dimension in low memory rendering pipeline (#4495 -
CVE-2025-12474)
Note: This release is for evaluation purposes and may contain bugs, including security bugs, that may not be individually documented when fixed. See the SECURITY.md file for details. Always prefer to use the latest release.
Please provide feedback and report bugs here.
v0.7.2
Fixed
- Huffman lookup table size fix (#3871 - CVE-2024-11403)
- Check height limit in modular trees. (#3943 - CVE-2024-11498)
Note: This release is for evaluation purposes and may contain bugs, including security bugs, that may not be individually documented when fixed. See the SECURITY.md file for details. Always prefer to use the latest release.
Please provide feedback and report bugs here.
v0.11.1
Fixed
- Huffman lookup table size fix (#3871 - CVE-2024-11403)
- Check height limit in modular trees. (#3943 - CVE-2024-11498)
Note: This release is for evaluation purposes and may contain bugs, including security bugs, that may not be individually documented when fixed. See the SECURITY.md file for details. Always prefer to use the latest release.
Please provide feedback and report bugs here.
v0.10.4
Fixed
- Huffman lookup table size fix (#3871 - CVE-2024-11403)
- Check height limit in modular trees. (#3943 - CVE-2024-11498)
Note: This release is for evaluation purposes and may contain bugs, including security bugs, that may not be individually documented when fixed. See the SECURITY.md file for details. Always prefer to use the latest release.
Please provide feedback and report bugs here.