-
Support for lossless compression via Zstandard
- Introduces
ZSTD_COMPRESSION/EXR_COMPRESSION_ZSTDenum - Features a custom data prep stage that includes ByteShuffle, optional Delta Encoding, and custom data reordering.
- Universal lossless support: Works for all image types (including Deep) and supports all OpenEXR pixel/data types.
- Deep image gains: Extensive testing with Deep scanlines shows a 20–30% size reduction compared to ZIPS based on image channels (with the best gains on Deep Alpha and Deep ID).
- Flat image file size: Achieves comparable compressed sizes to ZIPS.
- Flat image speed: Delivers slightly faster compression and decompression speeds compared to ZIPS
- Introduces a new dependency on the zstd library; a vendored version (v1.5.7) is provided as a fallback if no installed version is present.
- Introduces
-
Support for lossy compression based on the High Throughput JPEG 2000 (HTJ2K) standard.
- The LJ2K compressor uses the same JPEG 2000 constraints and codec library (OpenJPH) as HTJ2K256, but with lossy coding, producing smaller files at the cost of distortion.
- LJ2K should generally offer reduced file sizes and higher throughput compared to DWA.
- Currently supports 16-bit HALF, 32-bit FLOAT and 32-bit UINT channels. Lossy coding is currently applied only to RGB channels; other channels are losslessly coded.
- The amount of distortion is controlled via a quality level parameter that ranges from 1 to 150.
- As with DWA, lossy RGB channels are first transformed to a non-linear perceptual domain before coding. The transformation is log-based when the sample's magnitude is greater than 1, and power-law otherwise.
-
Improved support for the
colorInteropIDstandard attribute as a mechanism to identify the color space of the RGB images:- Added support for
colorInteropIDto command-line toolexrstdattr. - Added API functions to validate color metadata in the header to both the C++ and core APIs.
- Extended the exrinfo command-line tool to print warnings regarding header color metadata.
- Added helper functions to convert between chromaticities and
colorInteropID. - Added Python bindings for all new functions.
- See An ID for Color Interop
and Identifying the Color Space of OpenEXR Files for details.
- Added support for
-
Support for a cache for a (de)compression context in the core decode pipeline.
- This is a backwards compatible change (i.e. older versions of code compiled against previous headers will still work), with the exception that it does add the requirement that application code actually use the provided initializer when defining
exr_decode_pipeline_tobjects.
- This is a backwards compatible change (i.e. older versions of code compiled against previous headers will still work), with the exception that it does add the requirement that application code actually use the provided initializer when defining
-
For the OpenEXR python module:
- Support for the
idManifestattribute and object - Support for multithreaded read and write
- Support for reading/writing from/to
BytesIOobject - Add
setMaxImageSize/setMaxTileSizefunctions
- Support for the
-
Other changes:
AcesInputFile/AcesOutputFileandexr2acesas marked as deprecated and will be removed in a future release.- Improved handling of many channels
- All Imath headers are now included internally via
#include <Imath/...> - Remove
iex_debugTrap()function (was not used) - Improved
ChannelListIterator API - Fixed a bug that with DWA compression that could silently produce corrupted files.
-
Also of note:
- The vendored version of deflate is 1.26
- The vendored version of OpenJPH is 0.32.0
- The minimum required version of OpenJPH is 0.32.0
Security
This release addresses the following security vulnerabilities:
- OSS-Fuzz 514487287 Floating-point-exception in
part_exceeds_memory_limits - OSS-Fuzz 514423826 Divide-by-zero in
part_exceeds_memory_limits - OSS-Fuzz 513282267 Timeout in
openexr_exrgaps_fuzzer - OSS-Fuzz 512988066 Out-of-memory in
openexr_exrgaps_fuzzer
See CHANGES.md for more details.
















