First beta of the 3.1 release series.
Release 3.1 (target: Sept 2025?) -- compared to 3.0
- Beta 1: Aug 22, 2025
- Anticipated release candidate: Sep 1(ish), 2025
- Anticipated supported release: Sep 15, 2025
NOTE: We anticipate some additional changes to color management to be
rolled out during the beta period. It will not include any breaks to API or
ABI compatibility, but we do expect some behavior changes.
Executive Summary / Highlights:
- New image file support: Ultra HDR (HDR images in JPEG containers).
- oiiotool new commands:
--layersplit
,--pastemeta
,--demosaic
,
create-dir
and new expression expansion tokens:IS_CONSTANT
,
IS_BLACK
,SUBIMAGES
. - New IBA image processing functions:
scale()
,demosaic()
. - New 2-level namespace scheme that we hope will make it possible in the
future for our annual releases to NOT need to break backward ABI
compatibility. - Support in Python for
ImageBuf._repr_png_
method allows use of OIIO
inside Jupyter Notebooks to display computed
images. - Color management improvements to conform to Color Interchange Forum and
OpenEXR new conventions for naming and specifying color spaces.
New minimum dependencies and compatibility changes:
⛰️ New features and public API changes:
- New image file format support:
- jpeg: Support reading Ultra HDR images #4484 (by Loïc Vital) (3.1.0.0/3.0.1.0)
- oiiotool new features and major improvements:
- New expression eval tokens:
IS_CONSTANT
,IS_BLACK
#4610 (by Lydia Zheng) (3.1.1.0);SUBIMAGES
#4804 (3.1.3.0) --layersplit
, new command to split layers #4591 (by Loïc Vital) (3.1.1.0)--pastemeta
now takes additional modifiers that allows options for merging rather than rewriting, and is able to copy only a subset of the metadata specified by a regex. #4672 #4674 #4676 (3.1.1.0)--demosaic
add X-Trans demosaicing #4579 (by Anton Dukhovnikov) (3.1.1.0)--render_text
new modifiersmeasure=
andrender=
can
be used to measure the size of rendered text without drawing it.` #4681 (3.1.3.0)--create-dir
flag creates directories needed by-o
if they doesn't already exist #4762 (by Dharshan Vishwanatha) (3.1.3.0)--eraseattrib
new modifier:fromfile=1
reads from a file
to get a list of patterns to specify the attributes to erase. #4763 (by Lydia Zheng) (3.1.3.0)
- New expression eval tokens:
- Command line utilities:
- ImageBuf/ImageBufAlgo:
- New
ImageBuf::merge_metadata()
: merges one IB's metadata into another's without deleting the metadata already present. It can also filter which metadata are copied using a regex. #4672 (3.1.1.0) - New
ImageBufAlgo::scale()
: scales all channels of a multi-channel image by the single channel of a second image. #4541 (by Anton Dukhovnikov) (3.1.0.0/3.0.1.0) ImageBufAlgo::demosaic()
added support for X-Trans demosaicing #4579 (by Anton Dukhovnikov) (3.1.1.0)
- New
- APIs moving to
span
andimage_span
:
Add API calls usingspan
andimage_span
as the preferred alternative for
the historical calls that took raw pointers and spans to designate buffers
to read from or write into. - ImageCache/TextureSystem:
- maketx: Add maketx flags to increase feature parity with txmake #4841 (by Scott Milner) (3.1.4.0)
- New global attribute queries via OIIO::getattribute():
- Miscellaneous API changes:
- api: Make a 2-level namespace scheme #4567 (by Larry Gritz) #4603 (by Brecht Van Lommel) (3.1.1.0)
- api: ImageSpec::scanline_bytes, tile_bytes, image_bytes #4631 (3.1.1.0)
- python: ImageBuf
_repr_png_
method added, which allows use of
ImageBuf in Jupyter Notebooks as a displayable object. #4753 (by Oktay Comu) (3.1.3.0) - python: Add python stub files #4692 (by Chad Dombrova) (3.1.3.0)
- api: Add new ImageInput::supports() query: "mipmap" #4800 (3.1.3.0)
- Color management changes
🚀 Performance improvements:
- perf: IBA::unsharp_mask() speed and memory optimization #4513 (by Vlad (Kuzmin) Erium) (3.1.0.0/3.0.1.0)
- perf: Oiiotool --line --text --point --box speedups #4518 (3.1.0.0/3.0.1.0)
- perf: Jpeg2000 valid_file implementation, much faster than trying to open #4548 (by Aras Pranckevičius) (3.1.0.0/3.0.1.0)
- perf: Faster utf8<->utf16 conversion on Windows #4549 (by Aras Pranckevičius) (3.1.0.0/3.0.1.0)
- perf: Speed up
maketx --envlatl
when multithreaded by over 10x. #4825 - perf: Speed up OpenEXR non-core header read time #4832
🐛 Fixes and feature enhancements:
- oiiotool: Better handling of wildcards that match no files #4627 (3.1.1.0)
- oiotool: Invalid loop bound when appending mipmap textures using oiiotool #4671 (by Basile Fraboni) (3.1.1.0)
- oiiotool: -i:native=1, fix --native behavior, fix convert datatype #4708 (3.1.3.0)
- oiiotool: Fixes to --missingfile behavior #4803 (3.1.3.0)
- oiiotool: Allow thread control for --parallel-frames #4818 (3.1.3.0)
- color mgmt: Support OCIO Viewing Rules, other OCIO-related improvements #4780 (by zachlewis) (3.1.3.0)
- iv: Fix crash on .DS_Store; fix uppercase extensions #4764 (by Anton Dukhovnikov) (3.1.3.0)
- iv: Do not resize on open and other zoom fixes #4766 (by Aleksandr Motsjonov) (3.1.3.0)
- iv: Bug fix for iv window losing focus on mac on startup #4773 (by Aleksandr Motsjonov) (3.1.3.0)
- iv: Use screen pixel ratio to render sharp text in pixel view tool #4768 (by Aleksandr Motsjonov) (3.1.3.0)
- IBA: IBA:demosaic add white balancing #4499 (by Anton Dukhovnikov) (3.1.0.0/3.0.1.0)
- IBA: IBA:demosaic add white balancing #4499 (by Anton Dukhovnikov) (3.1.0.0/3.0.1.0)
- IBA: IBA::demosaic - fix roi channels #4602 (by Anton Dukhovnikov) (3.1.1.0)
- IBA: Add 'auto' value for all options of
IBA::demosaic()
#4786 (by Anton Dukhovnikov) (3.1.3.0) - ImageBuf: IB::pixeltype() did not always return the right value #4614 (3.1.1.0)
- ImageBuf: Fix bug in ImageBuf construction from ptr + neg strides #4630 (3.1.1.0)
- ImageBuf: Better errors for nonexistant subimages/mips #4801 (3.1.3.0)
- ImageInput: Incorrect IOProxy logic related to valid_file #4839 (3.1.4.0)
- python: Disable loading Python DLLs from PATH by default on Windows #4590 (by zachlewis) (3.1.1.0)
- python: Fix handle leak #4685 (3.1.3.0)
- python: IBA.demosaic had GIL release in wrong spot #4777 (3.1.3.0)
- python: Python ImageBuf.init_spec did not return correct value #4805 (3.1.3.0)
- python: Got strides wrong passing 2D numpy pixel array #4843 (3.1.4.0)
- exr: Allow an empty "name" metadata to be read #4528 #4536 (3.1.0.0/3.0.1.0)
- exr: Avoid integer overflow for large deep exr slice strides #4542 (3.1.0.0/3.0.1.0)
- exr: Fill in OpenEXR lineOrder attribute when reading #4628 (by vernalchen) (3.1.1.0)
- exr: Did not properly allocate 'missingcolor' vector #4751 (3.1.3.0)
- exr: Not honoring 'missingcolor' for scanline files #4757 (3.1.3.0)
- ico: More robust to corrupted ICO files #4625 (3.1.1.0)
- iff: Improved IFF support reading and writing z buffers #4673 (by Mikael Sundell) (3.1.3.0)
- jpeg: Support encoding/decoding arbitrary metadata as comments #4430 (by Lukas Stockner) (3.1.0.0/3.0.1.0)
- jpeg-2000: Write .j2c by adding HTJ2K Encoding using the OpenJPH library. #4699 (by Sam Richards) (3.1.3.0)
- png: Alpha premultiplication adjustment and attribute #4585 (3.1.1.0)
- png: Increase allowed width/height limit #4655 (by Jesse Yurkovich) (3.1.1.0)
- pnm: Broken pgm having memory access error #4559 (3.1.0.0)
- psd: Perform endian byteswap on correct buffer area for PSD RLE #4600 (by Jesse Yurkovich) (3.1.1.0)
- psd: ICC profile reading improvements, especially for PSD #4644 (3.1.1.0)
- psd: Updated tag recognition for psb #4663 (by Lydia Zheng) (3.1.1.0)
- raw: Fix channel layout #4516 (by Anton Dukhovnikov) (3.1.0.0/3.0.1.0)
- raw: Add black level and BPS metadata #4601 (by Anton Dukhovnikov) (3.1.1.0)
- raw: Add
raw:ForceLoad
ImageInput configuration hint #4704 (by Anton Dukhovnikov) (3.1.3.0) - rla: More robust to corrupted RLA files that could overrun buffers #4624 (3.1.1.0)
- sgi: Fix valid_file to properly swap bytes on little-endian platforms #4697 (by Jesse Yurkovich) (3.1.3.0)
- tiff: The default value for bitspersample should be 1 #4670 (by vernalchen) (3.1.1.0)
- webp: Respect the
oiio:UnassociatedAlpha
attribute #4770 (by Jesse Yurkovich) (3.1.3.0) - webp: Allow finer grained control over WEBP compression settings #4772 (by Jesse Yurkovich) (3.1.3.0)
- various formats: Detect invalid ICC profile tags #4557 #4561 (3.1.0.0)
- various formats: IPTC fields have length limits #4568 (3.1.0.0)
🔧 Internals and developer goodies
- int: Some LoggedTimer instances lacked a variable name #4571 (3.1.0.0)
- int: Various internal fixes to address Sonar and other warnings #4577 (3.1.0.0)
- int: No longer need OIIO_INLINE_CONSTEXPR macro #4607 (3.1.1.0)
- int: Get rid of some compiler symbols no longer needed #4606 (3.1.1.0)
- int: Switch to spans for some exif manipulation, fixing warnings #4689 (3.1.1.0)
- int: Rearrange initialize_cuda() for better err check, no warn #4726 (3.1.3.0)
- int: Experimental default_init_allocator and default_init_vector #4677 (3.1.3.0)
- int: Address some nickpick sonar warnings about TileID initialization #4722 (3.1.3.0)
- int: Address safety warnings in pvt::append_tiff_dir_entry #4737 (3.1.3.0)
- int: ImageInput/ImageOutput did not set per-file threads correctly #4750 (3.1.3.0)
- int/iv: Add raw string syntax modifier for VSCode and Cursor to understand its glsl #4796 (by Aleksandr Motsjonov) (3.1.3.0)
- int/iv: Use R"()" syntax for glsl shader strings for better readability #4795 (by Aleksandr Motsjonov) (3.1.3.0)
- int: ImageOutput::check_open logic was flawed #4779 (3.1.3.0)
- int: Switch to posix_spawnp for macOS background launch to enable PATH lookup #4834 (by Mikael Sundell) (3.1.4.0)
- filesystem.h: Filesystem::getline() #4569 (3.1.1.0)
- fmath.h: Add span-based bit_unpack() utility #4723 (3.1.3.0)
- fmath.h: Renaming and fixing of shuffle template #4739 (3.1.3.0)
- paramlist.h: ParamValue as_span, as_cspan (3.1.1.0)
- span.h: span_memcpy is a safer memcpy when you know the span boundaries #4597 (3.1.1.0)
- span.h: Only allow span-from-array if array for compatible size #4656 (3.1.1.0)
- span.h: OIIO::span improvements #4667 (3.1.1.0)
- span.h: Eliminate needless definitions of std::size #4652 (3.1.1.0)
- sysutil.h: Improve the implementation of Sysutil::put_in_background on macOS #4640 (by Mikael Sundell) (3.1.1.0)
- typedesc.h: Tidying of type trait templates #4705 (3.1.3.0)
🏗 Build/test/CI and platform ports:
- CMake build system and scripts:
- build: Add hardening options #4538 (3.1.0.0/3.0.1.0)
- build: Use target_compile_options (fixes a LibRaw build issue) #4556 (by Don Olmstead) (3.1.0.0)
- build: Python wheels workflow and build backend #4428 (by zachlewis) (3.1.1.0)
- build: Recent change broke when using non-Apple clang on Apple #4596 (3.1.1.0)
- build: Fix recently broken rpath setting #4618 (3.1.1.0)
- build: Improve OpenJpeg version detection. #4665 (by jreichel-nvidia) (3.1.1.0)
- build: Fix recently broken rpath to restore python wheel building #4633 (3.1.1.0)
- build: Ensure python-based builds use maj.min.patch SO versioning #4634 (by zachlewis) (3.1.1.0)
- build: Better disabling of work when USE_PYTHON=0 #4657 (3.1.1.0)
- build: Bump auto-build libdeflate to 1.23 to avoid AVX512 not available errors #4679 (by LI JI) (3.1.1.0)
- build: Cmake 4.0 compatibility #4686 #4688 (3.1.1.0)
- build: Make sure the CHANGES-2.x.md makes it into the installation #4611 (3.1.1.0)
- build: Address Robin-map vs CMake 4.0 compatibility #4701 (3.1.3.0)
- build: Fix broken OIIO_SITE customization #4709 (3.1.3.0)
- build: Restore OIIO_AVX512ER_ENABLED preprocessor symbol #4735 (3.1.3.0)
- build: Address compiler warnings #4724 (3.1.3.0)
- build: Fix furo requirement after recently breaking docs #4743 (3.1.3.0)
- build: Clean up Windows compilation warnings #4706 (3.1.3.0)
- build/python: Wheel upload_pypi step should only run from main repo #4820 (3.1.3.0)
- build: Fix typo related to finding ccache #4833 (3.1.4.0)
- build: C++23 support #4844 (3.1.4.0)
- Dependency and platform support:
- deps: Support static OCIO self-builds #4517 (by zachlewis) (3.1.0.0/3.0.1.0)
- deps: Add new ref output for libheif updates #4525 (3.1.0.0/3.0.1.0)
- build: Add build recipe for PNG #4423 (by zachlewis) (3.1.0.0/3.0.1.0)
- deps: Fix build_cmake.bash script for aarch64, bump its default version #4581 (3.1.1.0)
- deps: Fix libraw definitions (again) #4588 (3.1.1.0)
- deps: Detect libultrahdr version and enforce minimum of 1.3 #4729 (3.1.3.0)
- deps: Fix fmt throwing behavior warnings #4730 (3.1.3.0)
- deps: Fix failed test with old fmt #4758 (3.1.3.0)
- deps: Fix new dcmtk 3.6.9 vs C++ warning #4698 (3.1.3.0)
- build: PNG auto-build improvements #4835 (3.1.4.0)
- tests: Update ref image for slightly changed freetype accents #4765 (3.1.3.0)
- deps/ffmpeg: Replace deprecated and soon removed avcodec_close with avcodec_free_context #4837 (by Vlad Erium) (3.1.4.0)
- build/jpeg2000: Update jpeg2000input.cpp to include cstdarg #4836 (by Peter Kovář) (3.1.4.0)
- deps: Raise minimum supported Python from 3.7 to 3.9 #4830 (3.1.4.0)
- deps: Use get_plane2 introduced by libheif 1.20.2 #4851 (by toge) (3.1.4.0)
- windows: Include Windows version information on produced binaries #4696 (by Jesse Yurkovich) (3.1.3.0)
- windows + ARM64*: Add arm_neon.h include on Windows ARM64 with clang-cl #4691 (by Anthony Roberts)
- build/windows: Propagate CMAKE_MSVC_RUNTIME_LIBRARY #4842 (3.1.4.0)
- deps: Raise OpenColorIO minimum to 2.3 (from 2.2) #4865 (3.1.4.0)
- NetBSD: Fix build on NetBSD #4857 (by Thomas Klausner) (3.1.4.0)
- Testing and Continuous integration (CI) systems:
- tests: Improve Ptex testing #4573 (3.1.1.0)
- tests: Better testing coverage of null image reader/writer #4578 (3.1.1.0)
- tests: At long last, set up a softimage reading test (3.1.1.0)
- tests: Additional ref output for jpeg-corrupt test #4595 (3.1.1.0)
- ci: Increased the macos timeout slightly to fix spurious failures #4526 (3.1.0.0/3.0.1.0)
- ci: Don't rebuild docs in CI when only CMakeLists.txt changes #4539 (3.1.0.0/3.0.1.0)
- ci: Fix broken CI for ASWF 2021 and 2022 containers #4543 (3.1.0.0/3.0.1.0)
- ci: Refactor using a single steps workflow #4545 (3.1.0.0)
- ci: Fixups of analysis workflow #4572 (3.1.0.0)
- ci: Upgrade to newer actions #4570 (3.1.1.0)
- ci: Test and document support for WebP 1.5 and fmt 11.1 #4574 (3.1.1.0)
- ci: Only pass build-steps the secrets it needs #4576 (3.1.1.0)
- ci: Fix Windows 2019 CI -- make python version match the runner #4592 (3.1.1.0)
- ci: Raise 'latest' tests to use new fmt 11.1.2 #4593 (3.1.1.0)
- ci: Adjust some pugixml versions #4594 (3.1.1.0)
- ci: Allow special branch names to prune CI jobs #4604 (3.1.1.0)
- ci: Unbreak the scorecard workflow #4605 (3.1.1.0)
- ci: Switch to using ARM-native linux runners #4616 (by zachlewis) (3.1.1.0)
- ci: Run wheel workflow on certain pushes #4617 (3.1.1.0)
- ci: Add
numpy
as a runtime requirement #4638 (by zachlewis) (3.1.1.0) - ci: Move away from soon-to-be-deprecated ubuntu-20.04 GHA runner #4636 (3.1.1.0)
- ci: For docs workflow, lock down versions and speed up #4646 (3.1.1.0)
- ci: Improved clang-format CI task #4647 (3.1.1.0)
- ci: Add numpy as a runtime requirement #4654 (by zachlewis) (3.1.1.0)
- ci: Fix wheel building on Mac #4668 (3.1.1.0)
- ci: Update libPNG address and version for ci & autobuild #4659 (3.1.1.0)
- ci: Step naming adustments #4658 (3.1.1.0)
- ci: Fix wheel building on Mac ARM (continuation of #4668) #4675 (3.1.1.0)
- ci: Bump dependencies for "latest versions" CI test #4683 (3.1.1.0)
- ci: Update ABI standard after PR 4669 #4687 (3.1.1.0)
- ci: Save time by not checking out entire project history #4731 (3.1.3.0)
- ci: New variants for VFXP 2025, Windows 2025 #4744 (3.1.3.0)
- ci: Bump abi_check standard after ImageOutput changes #4747 (3.1.3.0)
- ci: Upload fixed python stubs as an artifact in CI #4754 (by Chad Dombrova) (3.1.3.0)
- ci: Update ref output to compensate for GitHub windows drive changes #4761 (3.1.3.0)
- ci: Pkg config libdir fix #4775 (by Scott Wilson) (3.1.3.0)
- ci: Add facility for benchmarking as part of CI #4745 (3.1.3.0)
- ci: Adjust ABI standard commit after ABI-breaking change of PR 4748 #4778 (3.1.3.0)
- ci: Add Linux ARM test #4749 (3.1.3.0)
- ci: Update linux arm clang reference output #4782 (3.1.3.0)
- ci: Bump 'latest releases' tests to use pybind11 3.0.0 #4828 (3.1.4.0)
- ci: For python stub generation, lock pybind11 to pre-3.0 #4831 (3.1.4.0)
- ci: Add a VFX Platform 2026 CI job #4856 (3.1.4.0)
- ci: Lock down to ci-oiio container with correct llvm components #4859 (3.1.4.0)
- ci: Bump webp and openexr for "latest versions" test #4861 (3.1.4.0)
📚 Notable documentation changes:
- docs: Clarify 'copy_image' example #4522 (3.1.0.0/3.0.1.0)
- docs: Update some old links to our new vanity URLs #4533 (3.1.0.0/3.0.1.0)
- docs: Quickstart guide #4531 (3.1.0.0/3.0.1.0)
- docs: First stab at an archiecture overview #4530 (3.1.0.0/3.0.1.0)
- docs: Fix typo in oiiotool's gradient fill argument #4589 (by Loïc Vital) (3.1.1.0)
- docs: Argparse documentation/comments typos #4612 (3.1.1.0)
- docs: Correct the type for BMP x/y density #4695 (by Campbell Barton) (3.1.3.0)
- docs: Specify the units for DPX scanned size #4694 (by Campbell Barton) (3.1.3.0)
- docs: INSTALL.md reset updated minimum dependencies from 3.0 #4700 (3.1.3.0)
- docs: Online docs improvements, mostly formatting #4736 (3.1.3.0)
- docs: Update Windows build instructions to rely on deps auto-build #4769 (3.1.3.0)
- docs: Correct docs and type of "resident_memory_used_MB" attribute #4824 (3.1.4.0)
🏢 Project Administration
- admin: Code review guidelines and tips #4532 (3.1.0.0/3.0.1.0)
- admin: Document how to make signed release tags #4529 (3.1.0.0/3.0.1.0)
- admin: Sign release artifacts #4580 (3.1.0.0)
- admin: Document Python Wheel completed in roadmap #4620 (by Todica Ionut) (3.1.1.0)
- admin: Add ".vs" to .gitignore #4645 (3.1.1.0)
- admin: Set up .gitattributes file #4648 (3.1.1.0)
- admin: Update SECURITY to reflect that 2.5 only gets critical fixes now #4829