Reading, writing, and processing images in a wide variety of file formats, using a format-agnostic API, aimed at VFX applications.

Overview

README for OpenImageIO

License Build Status Windows Build Status CII Best Practices

Introduction

The primary target audience for OIIO is VFX studios and developers of tools such as renderers, compositors, viewers, and other image-related software you'd find in a production pipeline.

OpenImageIO consists of:

  • Simple but powerful ImageInput and ImageOutput APIs that provide an abstraction for reading and writing image files of nearly any format, without the calling application needing to know any of the details of these file formats, and indeed without the calling application needing to be aware of which formats are available.

  • A library that manages subclasses of ImageInput and ImageOutput that implement I/O from specific file formats, with each file format's implementation stored as a plug-in. Therefore, an application using OpenImageIO's APIs can read and write any image file for which a plugin can be found at runtime.

  • Plugins implementing I/O for several popular image file formats, including TIFF, JPEG/JFIF, OpenEXR, PNG, HDR/RGBE, ICO, BMP, Targa, JPEG-2000, RMan Zfile, FITS, DDS, Softimage PIC, PNM, DPX, Cineon, IFF, Field3D, OpenVDB, Ptex, Photoshop PSD, Wavefront RLA, SGI, WebP, GIF, DICOM, HEIF/HEIC/AVIF, many "RAW" digital camera formats, and a variety of movie formats (readable as individual frames). More are being developed all the time.

  • Several command line image tools based on these classes, including oiiotool (command-line format conversion and image processing), iinfo (print detailed info about images), iconvert (convert among formats, data types, or modify metadata), idiff (compare images), igrep (search images for matching metadata), and iv (an image viewer). Because these tools are based on ImageInput/ImageOutput, they work with any image formats for which ImageIO plugins are available.

  • An ImageCache class that transparently manages a cache so that it can access truly vast amounts of image data (tens of thousands of image files totaling multiple TB) very efficiently using only a tiny amount (tens of megabytes at most) of runtime memory.

  • A TextureSystem class that provides filtered MIP-map texture lookups, atop the nice caching behavior of ImageCache. This is used in commercial renderers and has been used on many large VFX and animated films.

  • ImageBuf and ImageBufAlgo functions -- a simple class for storing and manipulating whole images in memory, and a collection of the most useful computations you might want to do involving those images, including many image processing operations.

  • Python bindings for all of the major APIs.

Licensing

OpenImageIO is (c) Copyright Contributors to the OpenImageIO project.

OpenImageIO is distributed using the modified BSD license (also known as the "new BSD" or "3-clause BSD" license). The documentation is licensed under the Creative Commons Attribution 3.0 Unported License.

The plain English bottom line is that OpenImageIO is free, as well as freely modifiable and redistributable (in both source and binary form). You may use part or all of it in your own applications, whether proprietary or open, free or commercial. Using it in a commercial or proprietary application DOES NOT obligate you to pay us, or to use any particular licensing terms in your own application.

Some code and resources are distributed along with OIIO that have highly compatible, though slightly different, licenses (generally MIT or Apache). See the PDF documentation Acknowledgements section, and the THIRD-PARTY file for details.

Building and Installation

Please read the INSTALL.md file for detailed instructions on how to build and install OpenImageIO.

If you build with EMBEDPLUGINS=0, remember that you need to set the environment variable OIIO_LIBRARY_PATH to point to the 'lib' directory where OpenImageIO is installed, or else it will not be able to find the plugins.

Documentation

The primary user and programmer documentation can be found on openimageio.readthedocs.io as html or as PDF.

Contact & reporting problems

Simple "how do I...", "I'm having trouble", or "is this a bug" questions are best asked on the oiio-dev developer mail list. That's where the most people will see it and potentially be able to answer your question quickly (more so than a GH "issue").

Bugs, build problems, and discovered vulnerabilities that you are relatively certain is a legit problem in the code, and for which you can give clear instructions for how to reproduce, should be reported as issues.

If confidentiality precludes a public question or issue, you may contact us privately at [email protected], or for security-related issues [email protected].

Contributing

OpenImageIO welcomes code contributions, and nearly 150 people have done so over the years. We take code contributions via the usual GitHub pull request (PR) mechanism. Please see CONTRIBUTING for detailed instructions.

Web Resources

Main web page: http://www.openimageio.org

GitHub page: http://github.com/OpenImageIO/oiio

Mail list subscriptions and archives:

Comments
  • ImageCache: On-demand layer reading for multi-layered files

    ImageCache: On-demand layer reading for multi-layered files

    Hi,

    First off thanks for this amazing library. We use it extensively in Natron (open-source compositing software) (https://github.com/MrKepzie/Natron/tree/workshop via OpenFX: https://github.com/MrKepzie/openfx-io ) for most of the image reading/writing.

    We have received some complaints by our users that the reading of multi-layered EXR files was freakishly slow compared to other similar applications. I have narrowed it down to the ImageCache of OIIO. We make use of the ImageCache::get_pixels function. The problem is that if the image is not present into the cache, the OIIO cache internaly will create a new Tile and calls ImageInput::read_image which in turns calls
    ImageInput::read_scanlines(ybegin,yend,z,0,m_spec.nchannels,format,data,xstride,ystride)

    So basically regardless of what we requested via the get_pixels function with chbegin and chend, the Tile will always decode all available layers in the image. Needless to say that for EXR files rendered out with many passes it takes a while.

    Could this be improved to only read the channels that were requested by ImageCache::get_pixels in the first place ?

    Our temporary workaround is to use the ImageInput::read_scanlines API directly, but we suffer from the lack of caching because if the user of Natron requests more than 1 layer to display, it will open as many ImageInput on our side that the the user requested, which is not efficient at all.

    opened by MrKepzie 43
  • ThreadSanitizer says ustring.cpp:179 has a data race

    ThreadSanitizer says ustring.cpp:179 has a data race

    While using ThreadSanitizer to check Duke's implementation I stumbled upon this data race.

    WARNING: ThreadSanitizer: data race (pid=17556)
      Atomic write of size 4 at 0x7ff153d4cdc0 by thread T2:
        #0 __tsan_atomic32_exchange ??:0 (exe+0x0000001376a7)
        #1 OpenImageIO::v1_3::spin_mutex::try_lock() /home/clitte/git/oiio/src/include/thread.h:570 (libOpenImageIO.so.1.3+0x0000003d482a)
        #2 OpenImageIO::v1_3::spin_mutex::lock() /home/clitte/git/oiio/src/include/thread.h:534 (libOpenImageIO.so.1.3+0x0000003d4731)
        #3 OpenImageIO::v1_3::spin_rw_mutex::read_lock() /home/clitte/git/oiio/src/include/thread.h:633 (libOpenImageIO.so.1.3+0x000000b62ff7)
        #4 read_lock_guard /home/clitte/git/oiio/src/include/thread.h:669 (libOpenImageIO.so.1.3+0x000000b62f96)
        #5 read_lock_guard /home/clitte/git/oiio/src/include/thread.h:669 (libOpenImageIO.so.1.3+0x000000b58430)
        #6 OpenImageIO::v1_3::ustring::make_unique(char const*) /home/clitte/git/oiio/src/libutil/ustring.cpp:179 (libOpenImageIO.so.1.3+0x000000b56457)
        #7 ustring /home/clitte/git/oiio/src/include/ustring.h:166 (libOpenImageIO.so.1.3+0x000000306ea6)
        #8 ustring /home/clitte/git/oiio/src/include/ustring.h:167 (libOpenImageIO.so.1.3+0x000000306e10)
        #9 ustring /home/clitte/git/oiio/src/include/ustring.h:186 (libOpenImageIO.so.1.3+0x000000306c67)
        #10 ustring /home/clitte/git/oiio/src/include/ustring.h:186 (libOpenImageIO.so.1.3+0x000000306bd0)
        #11 OpenImageIO::v1_3::ParamValue::init(std::string, OpenImageIO::v1_3::TypeDesc, int, void const*, bool) /home/clitte/git/oiio/src/include/paramlist.h:104 (libOpenImageIO.so.1.3+0x0000002e8399)
        #12 OpenImageIO::v1_3::ImageSpec::attribute(std::string const&, OpenImageIO::v1_3::TypeDesc, void const*) /home/clitte/git/oiio/src/libOpenImageIO/formatspec.cpp:355 (libOpenImageIO.so.1.3+0x0000002d962f)
        #13 OpenImageIO::v1_3::ImageSpec::attribute(std::string const&, char const*) /home/clitte/git/oiio/src/include/imageio.h:306 (libOpenImageIO.so.1.3+0x0000002c2643)
        #14 OpenImageIO::v1_3::JpgInput::open(std::string const&, OpenImageIO::v1_3::ImageSpec&) /home/clitte/git/oiio/src/jpeg.imageio/jpeginput.cpp:212 (libOpenImageIO.so.1.3+0x000000d76af6)
        #15 OpenImageIOReader /home/clitte/git/duke/src/duke/imageio_plugins/openimageio/OpenImageIO.cpp:135 (exe+0x0000001603b6)
        #16 OpenImageIOReader /home/clitte/git/duke/src/duke/imageio_plugins/openimageio/OpenImageIO.cpp:175 (exe+0x00000015fee0)
        #17 duke::OpenImageIODescriptor::getReaderFromFile(char const*) const /home/clitte/git/duke/src/duke/imageio_plugins/openimageio/OpenImageIO.cpp:223 (exe+0x00000015fdba)
        #18 duke::(anonymous namespace)::tryReader(char const*, duke::IIODescriptor const*, std::function<void (duke::RawPackedFrame&&, void const*)> const&) /home/clitte/git/duke/src/duke/engine/ImageLoadUtils.cpp:45 (exe+0x0000002e7f80)
        #19 duke::(anonymous namespace)::load(char const*, char const*, std::function<void (duke::RawPackedFrame&&, void const*)> const&) /home/clitte/git/duke/src/duke/engine/ImageLoadUtils.cpp:55 (exe+0x0000002e6d71)
        #20 duke::load(char const*, char const*, std::function<void (duke::RawPackedFrame&&, void const*)> const&, std::string&) /home/clitte/git/duke/src/duke/engine/ImageLoadUtils.cpp:66 (exe+0x0000002e69a3)
        #21 duke::LoadedImageCache::workerStep(std::pair<duke::IMediaStream const*, unsigned long>&, std::string&, std::string&) /home/clitte/git/duke/src/duke/engine/cache/LoadedImageCache.cpp:142 (exe+0x00000024d04c)
        #22 duke::LoadedImageCache::workerFunction() /home/clitte/git/duke/src/duke/engine/cache/LoadedImageCache.cpp:109 (exe+0x00000024c82f)
        #23 void std::_Mem_fn<void (duke::LoadedImageCache::*)()>::operator()<, void>(duke::LoadedImageCache*) const /usr/lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/functional:601 (exe+0x00000026ca43)
        #24 void std::_Bind_simple<std::_Mem_fn<void (duke::LoadedImageCache::*)()> (duke::LoadedImageCache*)>::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/functional:1732 (exe+0x00000026c8d0)
        #25 std::_Bind_simple<std::_Mem_fn<void (duke::LoadedImageCache::*)()> (duke::LoadedImageCache*)>::operator()() /usr/lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/functional:1720 (exe+0x00000026c840)
        #26 std::thread::_Impl<std::_Bind_simple<std::_Mem_fn<void (duke::LoadedImageCache::*)()> (duke::LoadedImageCache*)> >::_M_run() /usr/lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/thread:115 (exe+0x00000026c7e9)
        #27 <null> <null>:0 (libstdc++.so.6+0x0000000b1d2f)
    
      Previous write of size 4 at 0x7ff153d4cdc0 by thread T1:
        #0 OpenImageIO::v1_3::spin_mutex::unlock() /home/clitte/git/oiio/src/include/thread.h:553 (libOpenImageIO.so.1.3+0x0000003d4618)
        #1 OpenImageIO::v1_3::spin_rw_mutex::read_lock() /home/clitte/git/oiio/src/include/thread.h:637 (libOpenImageIO.so.1.3+0x000000b63015)
        #2 read_lock_guard /home/clitte/git/oiio/src/include/thread.h:669 (libOpenImageIO.so.1.3+0x000000b62f96)
        #3 read_lock_guard /home/clitte/git/oiio/src/include/thread.h:669 (libOpenImageIO.so.1.3+0x000000b58430)
        #4 OpenImageIO::v1_3::ustring::make_unique(char const*) /home/clitte/git/oiio/src/libutil/ustring.cpp:179 (libOpenImageIO.so.1.3+0x000000b56457)
        #5 ustring /home/clitte/git/oiio/src/include/ustring.h:166 (libOpenImageIO.so.1.3+0x000000306ea6)
        #6 ustring /home/clitte/git/oiio/src/include/ustring.h:167 (libOpenImageIO.so.1.3+0x000000306e10)
        #7 ustring /home/clitte/git/oiio/src/include/ustring.h:186 (libOpenImageIO.so.1.3+0x000000306c67)
        #8 ustring /home/clitte/git/oiio/src/include/ustring.h:186 (libOpenImageIO.so.1.3+0x000000306bd0)
        #9 OpenImageIO::v1_3::ParamValue::init(std::string, OpenImageIO::v1_3::TypeDesc, int, void const*, bool) /home/clitte/git/oiio/src/include/paramlist.h:104 (libOpenImageIO.so.1.3+0x0000002e8399)
        #10 OpenImageIO::v1_3::ImageSpec::attribute(std::string const&, OpenImageIO::v1_3::TypeDesc, void const*) /home/clitte/git/oiio/src/libOpenImageIO/formatspec.cpp:355 (libOpenImageIO.so.1.3+0x0000002d962f)
        #11 OpenImageIO::v1_3::ImageSpec::attribute(std::string const&, char const*) /home/clitte/git/oiio/src/include/imageio.h:306 (libOpenImageIO.so.1.3+0x0000002c2643)
        #12 OpenImageIO::v1_3::JpgInput::open(std::string const&, OpenImageIO::v1_3::ImageSpec&) /home/clitte/git/oiio/src/jpeg.imageio/jpeginput.cpp:212 (libOpenImageIO.so.1.3+0x000000d76af6)
        #13 OpenImageIOReader /home/clitte/git/duke/src/duke/imageio_plugins/openimageio/OpenImageIO.cpp:135 (exe+0x0000001603b6)
        #14 OpenImageIOReader /home/clitte/git/duke/src/duke/imageio_plugins/openimageio/OpenImageIO.cpp:175 (exe+0x00000015fee0)
        #15 duke::OpenImageIODescriptor::getReaderFromFile(char const*) const /home/clitte/git/duke/src/duke/imageio_plugins/openimageio/OpenImageIO.cpp:223 (exe+0x00000015fdba)
        #16 duke::(anonymous namespace)::tryReader(char const*, duke::IIODescriptor const*, std::function<void (duke::RawPackedFrame&&, void const*)> const&) /home/clitte/git/duke/src/duke/engine/ImageLoadUtils.cpp:45 (exe+0x0000002e7f80)
        #17 duke::(anonymous namespace)::load(char const*, char const*, std::function<void (duke::RawPackedFrame&&, void const*)> const&) /home/clitte/git/duke/src/duke/engine/ImageLoadUtils.cpp:55 (exe+0x0000002e6d71)
        #18 duke::load(char const*, char const*, std::function<void (duke::RawPackedFrame&&, void const*)> const&, std::string&) /home/clitte/git/duke/src/duke/engine/ImageLoadUtils.cpp:66 (exe+0x0000002e69a3)
        #19 duke::LoadedImageCache::workerStep(std::pair<duke::IMediaStream const*, unsigned long>&, std::string&, std::string&) /home/clitte/git/duke/src/duke/engine/cache/LoadedImageCache.cpp:142 (exe+0x00000024d04c)
        #20 duke::LoadedImageCache::workerFunction() /home/clitte/git/duke/src/duke/engine/cache/LoadedImageCache.cpp:109 (exe+0x00000024c82f)
        #21 void std::_Mem_fn<void (duke::LoadedImageCache::*)()>::operator()<, void>(duke::LoadedImageCache*) const /usr/lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/functional:601 (exe+0x00000026ca43)
        #22 void std::_Bind_simple<std::_Mem_fn<void (duke::LoadedImageCache::*)()> (duke::LoadedImageCache*)>::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/functional:1732 (exe+0x00000026c8d0)
        #23 std::_Bind_simple<std::_Mem_fn<void (duke::LoadedImageCache::*)()> (duke::LoadedImageCache*)>::operator()() /usr/lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/functional:1720 (exe+0x00000026c840)
        #24 std::thread::_Impl<std::_Bind_simple<std::_Mem_fn<void (duke::LoadedImageCache::*)()> (duke::LoadedImageCache*)> >::_M_run() /usr/lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/thread:115 (exe+0x00000026c7e9)
        #25 <null> <null>:0 (libstdc++.so.6+0x0000000b1d2f)
    
      Thread T2 (tid=17560, running) created by main thread at:
        #0 pthread_create ??:0 (exe+0x000000123772)
        #1 <null> <null>:0 (libstdc++.so.6+0x0000000b1f7e)
        #2 std::thread::thread<void (duke::LoadedImageCache::*)(), duke::LoadedImageCache*>(void (duke::LoadedImageCache::*&&)(), duke::LoadedImageCache*&&) /usr/lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/thread:138 (exe+0x000000268ab0)
        #3 void __gnu_cxx::new_allocator<std::thread>::construct<std::thread, void (duke::LoadedImageCache::*)(), duke::LoadedImageCache*>(std::thread*, void (duke::LoadedImageCache::*&&)(), duke::LoadedImageCache*&&) /usr/lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/ext/new_allocator.h:120 (exe+0x0000002689f5)
        #4 _ZNSt16allocator_traitsISaISt6threadEE12_S_constructIS0_JMN4duke16LoadedImageCacheEFvvEPS5_EEENSt9enable_ifIXsr18__construct_helperIT_DpT0_EE5valueEvE4typeERS1_PSA_DpOSB_ /usr/lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/bits/alloc_traits.h:254 (exe+0x0000002688fd)
        #5 _ZNSt16allocator_traitsISaISt6threadEE9constructIS0_JMN4duke16LoadedImageCacheEFvvEPS5_EEEDTcl12_S_constructfp_fp0_spclsr3stdE7forwardIT0_Efp1_EEERS1_PT_DpOS9_ /usr/lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/bits/alloc_traits.h:393 (exe+0x000000266acd)
        #6 void std::vector<std::thread, std::allocator<std::thread> >::_M_emplace_back_aux<void (duke::LoadedImageCache::*)(), duke::LoadedImageCache*>(void (duke::LoadedImageCache::*&&)(), duke::LoadedImageCache*&&) /usr/lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/bits/vector.tcc:409 (exe+0x000000266d0e)
        #7 void std::vector<std::thread, std::allocator<std::thread> >::emplace_back<void (duke::LoadedImageCache::*)(), duke::LoadedImageCache*>(void (duke::LoadedImageCache::*&&)(), duke::LoadedImageCache*&&) /usr/lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/bits/vector.tcc:101 (exe+0x00000024f497)
        #8 duke::LoadedImageCache::startWorkers() /home/clitte/git/duke/src/duke/engine/cache/LoadedImageCache.cpp:93 (exe+0x00000024ba46)
        #9 duke::LoadedImageCache::load(duke::Timeline const&) /home/clitte/git/duke/src/duke/engine/cache/LoadedImageCache.cpp:32 (exe+0x00000024bbbb)
        #10 duke::LoadedTextureCache::load(duke::Timeline const&) /home/clitte/git/duke/src/duke/engine/cache/LoadedTextureCache.cpp:20 (exe+0x00000020d995)
        #11 duke::Player::load(duke::Timeline const&, FrameDuration const&) /home/clitte/git/duke/src/duke/engine/Player.cpp:11 (exe+0x000000277019)
        #12 duke::DukeMainWindow::load(duke::Timeline const&, FrameDuration const&, duke::FitMode, int) /home/clitte/git/duke/src/duke/engine/DukeMainWindow.cpp:64 (exe+0x0000001e9269)
        #13 DukeApplication /home/clitte/git/duke/src/duke/engine/DukeApplication.cpp:136 (exe+0x0000001be2ef)
        #14 main /home/clitte/git/duke/src/duke/main.cpp:37 (exe+0x000000168d34)
    
      Thread T1 (tid=17559, running) created by main thread at:
        #0 pthread_create ??:0 (exe+0x000000123772)
        #1 <null> <null>:0 (libstdc++.so.6+0x0000000b1f7e)
        #2 std::thread::thread<void (duke::LoadedImageCache::*)(), duke::LoadedImageCache*>(void (duke::LoadedImageCache::*&&)(), duke::LoadedImageCache*&&) /usr/lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/thread:138 (exe+0x000000268ab0)
        #3 void __gnu_cxx::new_allocator<std::thread>::construct<std::thread, void (duke::LoadedImageCache::*)(), duke::LoadedImageCache*>(std::thread*, void (duke::LoadedImageCache::*&&)(), duke::LoadedImageCache*&&) /usr/lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/ext/new_allocator.h:120 (exe+0x0000002689f5)
        #4 _ZNSt16allocator_traitsISaISt6threadEE12_S_constructIS0_JMN4duke16LoadedImageCacheEFvvEPS5_EEENSt9enable_ifIXsr18__construct_helperIT_DpT0_EE5valueEvE4typeERS1_PSA_DpOSB_ /usr/lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/bits/alloc_traits.h:254 (exe+0x0000002688fd)
        #5 _ZNSt16allocator_traitsISaISt6threadEE9constructIS0_JMN4duke16LoadedImageCacheEFvvEPS5_EEEDTcl12_S_constructfp_fp0_spclsr3stdE7forwardIT0_Efp1_EEERS1_PT_DpOS9_ /usr/lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/bits/alloc_traits.h:393 (exe+0x000000266acd)
        #6 void std::vector<std::thread, std::allocator<std::thread> >::_M_emplace_back_aux<void (duke::LoadedImageCache::*)(), duke::LoadedImageCache*>(void (duke::LoadedImageCache::*&&)(), duke::LoadedImageCache*&&) /usr/lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/bits/vector.tcc:409 (exe+0x000000266d0e)
        #7 void std::vector<std::thread, std::allocator<std::thread> >::emplace_back<void (duke::LoadedImageCache::*)(), duke::LoadedImageCache*>(void (duke::LoadedImageCache::*&&)(), duke::LoadedImageCache*&&) /usr/lib64/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../include/c++/4.8.2/bits/vector.tcc:101 (exe+0x00000024f497)
        #8 duke::LoadedImageCache::startWorkers() /home/clitte/git/duke/src/duke/engine/cache/LoadedImageCache.cpp:93 (exe+0x00000024ba46)
        #9 duke::LoadedImageCache::load(duke::Timeline const&) /home/clitte/git/duke/src/duke/engine/cache/LoadedImageCache.cpp:32 (exe+0x00000024bbbb)
        #10 duke::LoadedTextureCache::load(duke::Timeline const&) /home/clitte/git/duke/src/duke/engine/cache/LoadedTextureCache.cpp:20 (exe+0x00000020d995)
        #11 duke::Player::load(duke::Timeline const&, FrameDuration const&) /home/clitte/git/duke/src/duke/engine/Player.cpp:11 (exe+0x000000277019)
        #12 duke::DukeMainWindow::load(duke::Timeline const&, FrameDuration const&, duke::FitMode, int) /home/clitte/git/duke/src/duke/engine/DukeMainWindow.cpp:64 (exe+0x0000001e9269)
        #13 DukeApplication /home/clitte/git/duke/src/duke/engine/DukeApplication.cpp:136 (exe+0x0000001be2ef)
        #14 main /home/clitte/git/duke/src/duke/main.cpp:37 (exe+0x000000168d34)
    
    SUMMARY: ThreadSanitizer: data race ??:0 __tsan_atomic32_exchange
    
    
    opened by gchatelet 42
  • Sketch of a C API for comment

    Sketch of a C API for comment

    Description

    This adds a minimal C API called "coiio" currently that is built as an additional shared library, the implementation of which is under src/coiio and gated behind option BUILD_COIIO (defaults to ON in this PR). I've also added a test under testsuite/coiio that exercises it by loading a tiff, adding a couple of attributes to the header, writing it out as an exr, then reading the exr back and getting the attribute values.

    Notable things are right now I've only wrapped TypeDesc::TypeDesc(string_view) as TypeDesc_from_string in order to generate TypeDescs because it was quick. I imagine we'll ultimately want to declare prebuilt extern TypeDesc objects as a replacement for the static constexpr ones for commonly used types in C++.

    One slight wrinkle is in all the *_geterror() functions. In C++ they return a copy of an internally owned std::string. I've worked around this for now by caching the string in a thread_local and returning a pointer from that to C. I'm not completely up to date on the semantics of thread_local (does it even work in Apple's libc++ yet?) so not sure if this is that great.

    An alternative would be to add a new function, e.g. const char* ImageInput::geterrorc() that would just call m_errmsg.c_str(), then ImageInput::geterror() could call that and make a copy of the string to return, while the C API would just call geterrorc, with an explicit warning that the pointer is only valid until the ImageInput is mutated again. Obviously if ImageInput were to be mutated from another thread then all bets are off and thus I don't think this idea works.

    Yet another way, and an idiom you see often in C APIs would be to provide a couple more functions:

    int ImageInput::geterrorlength() { return m_errmsg.size(); }
    void ImageInput::geterrormsg(char* msg) { strcpy(msg, m_errmsg.c_str(), m_errmsg.size()); }
    

    and have the caller manage the memory. In the multithreaded case this also doesn't work, but another way of doing this is:

    void ImageInput::geterrormsg(char* msg, int buffer_len) { 
        lock_guard lock(m_mutex);
        strcpy(msg, m_errmsg.c_str(), min(buffer_len, m_errmsg.size()));
    }
    

    Plenty of opportunity for bikeshedding here too. The name is just what I called the library in my rust crate, so can be whatever you prefer. I would suggest making it different enough from OpenImageIO so that you don't mistake the headers in include statements though, e.g.:

    #include <OpenImageIO/imagebuf.h>
    #include <COpenImageIO/imageio.h> //< oops, but probably won't lead to subtle bugs so may be ok?
    

    Tests

    New test is testsuite/coiio. I also copied over run_app() from OSL to the testsuite to allow building the test binary as part of the test.

    Checklist:

    • [x] I have read the contribution guidelines.
    • [ ] If this is more extensive than a small change to existing code, I have previously submitted a Contributor License Agreement (individual, and if there is any way my employers might think my programming belongs to them, then also corporate).
    • [x] I have updated the documentation, if applicable.
    • [x] I have ensured that the change is tested somewhere in the testsuite (adding new test cases if necessary).
    • [x] My code follows the prevailing code style of this project.

    TODO checklist:

    • [x] Add licence blurb to each file
    • [x] 3 lines between functions
    • [x] extra newline before closing namespace
    • [x] rename files to c-imageio.h (or imageio-c.h?)
    • [x] fix doc comments to refer to underlying C++ instead of copying full doc comments
    • [x] Resolve geterror() situation
    opened by anderslanglands 37
  • Does OpenImageIO support nChannel images

    Does OpenImageIO support nChannel images

    Hi, just a question can images (tiff, PSD and others) with more than 4 Channels be read into a memory buffer and written back using OpenImageIO? In the printing industry images with CMYK plus a number of spot color channels are quite common. Photoshop files must only be read, but TIFF must be written.

    Is also BigTIFF supported?

    Regards

    Stefan

    opened by StefanWoe 33
  • Added support for converting ImageBuf to OpenCV IplImage

    Added support for converting ImageBuf to OpenCV IplImage

    Hey,

    This PR is to add support for converting from ImageBuf to IplImage. I noticed there was the code to go one way, but not the other. If there's any bad code smell, let me know. I'm primarily a Python programmer, so there's a few things that I'm use to being able to do in Python that I can't seem to do in C++. It could be a limitation of the programmer (most likely), or the language.

    If this successfully goes through, then I'll work on implementing OpenCV's Mat next.

    I have tested this on a simple image that I grabbed from the net, so it works, but may break under more testing. I want to clean up the code more before I try throwing more image types at this.

    One thing that isn't supported right now is the Half type because I'm not sure how is the best way to handle that. Suggestions welcome!

    opened by scott-wilson 31
  • Make atomic_test and spinlock_test run for many more iterations, and time their results.

    Make atomic_test and spinlock_test run for many more iterations, and time their results.

    Make atomic_test and spinlock_test run for many more iterations, and time their results.

    This allows us to rigorously compare the speed of our atomics and spin locks. Also make their output a little neater by locking around the status printouts, and eliminate the #if's that provide safety for Boost < 1.35, which is no longer supported.

    opened by lgritz 30
  • Allow ImageCache/TextureSystem to store partial channel sets in cache.

    Allow ImageCache/TextureSystem to store partial channel sets in cache.

    Allow ImageCache/TextureSystem to store partial channel sets in cache.

    ImageCache's original design would read all channels into a tile, because (1) most files have only a few channels, (2) most uses (for example, texture) tend to use most or all of the channels in the file, in close temporal proximity if not in the same lookup, (3) most file formats don't have a way to read a channel subset that's any more efficient than reading all of them.

    However, for the rare case that there are MANY channels, only a few of which are needed (for example, looking up 3 channels of textures from a 40 channel file), this is very wasteful of texture space, and MAY (depending on the format) also be wasteful of I/O.

    So this patch:

    • Modifies ImageCache so that a tile can store any contiguous subset of channels. This means the TileID stores a chbegin/chend range, the hashes consider this, and certain ImageCache public API calls now have varieties that take chbegin/chend parameters.
    • ImageCache will create cache tiles that store exactly the channel range requested. The default is all channels in the tile. Use subsets wisely -- if you have a 4-channel file and you separately look up channel ranges [0,1) and [0,3), it will redundantly read and store the overlapping channels!
    • TextureSystem is modified to ask for all channels when there are only a few channels in the file, but when there are more than max_tile_channels (a new settable attribute of the TS) channels in the file, it will ask the IC for only the channels it needs for the texture lookup. The max_tile_channels is set by default to 5, which means for the vast majority of files (R, RGB, RGBA, RGBAZ) it will read all channels and behave as before. But if you have a mega-channel file, it will try to read and cache only the subset of channels you requested with the texture call. If you don't want the new behavior, just set max_tile_channels to something bigger.

    The bottom line is that if your app uses IC with the old API calls, or if you use TS with texture files having 5 or fewer channels (which is almost always the case), you should see no change in behavior or performance. But for those of you who for some reason deal with files of many many channels, accessing a small subset of them via texture or IC should result much more efficient cache behavior because the IC won't be caching channels you aren't accessing.

    opened by lgritz 28
  • Raw input: Added new input format for camera raw formats. Uses LibRaw.

    Raw input: Added new input format for camera raw formats. Uses LibRaw.

    Hi,

    I've been working on this for a few days, and just wanted to get some feedback. Raw format reader powered by LibRaw. Handles most RAW formats. I've given some attributes to control the most common settings (Exposure, ColorSpace primaries, Demosaic algorithm). Only thing missing at the moment is the EXIF metadata, but It shouldn't be too difficult to add that in.

    Thanks, Mark

    formats 
    opened by Shootfast 28
  • [Feature Request] Ability to read an image from memory

    [Feature Request] Ability to read an image from memory

    Following up on a conversation with @lgritz , I'd like to request the other direction of what #1895 is requesting.

    The Need

    In USD and Hydra, we’ve been relying on OIIO for marquee image services, and it’s far and away the most compelling choice. However, recently we’ve grown a need to be able to decode formats (USD, images, volumes) from in-memory buffers, which may have been mmapped from files or created or transmitted. There are two different scenarios:

    1. We’re providing an archive format that, in a single (uncompressed zip) file, contains USD files, textures, and anything else a scene requires. To be able to consume the scene without unpacking it, we want to access data out of it by mmapping with offsets into the zip file.
    2. People can create “asset resolvers” that deliver data to USD directly over the network, from dbs, etc, and would like to void the step of writing that data out to disk.

    So...

    We'd like to be able to hand OIIO a buffer-pointer, plus length, plus "identifier" that corresponds to a filename and has an extension that indicate format; that buffer represents an actual serialized image. When we're using OIIO as primarily an image reader, the problem is reasonably straightforward - as Larry suggested, we should be able to initialize an ImageInput from these inputs. This is sufficient for our more immediate needs.

    The more involved case is when a client wants to use OIIO as a texture manager, using ImageCache/TextureSystem . In that case, we need to acknowledge that our buffer is a resource that needs to be managed, so we will need a way to allow OIIO to do that. On the USD-side, we'll have a resource object whose lifetime manages the buffer's lifetime, but we'd need a way to adapt that for OIIO's consumption.

    Thanks!

    core APIs feature request 
    opened by spiffmon 26
  • [jpeg2000] libjasper does not create profile 3 and profile 4 images required for Digital Cinema applications

    [jpeg2000] libjasper does not create profile 3 and profile 4 images required for Digital Cinema applications

    Based on private mail with Terrance Mali..., the author of OpenDCP, he brought up the fact that Jasper does not support profile 3 or 4 of the jpeg2000 spec as well as supporting codestream lengths or single tiles, making it unsuitable for DCDM creation.

    The solution I put forward is to rewrite the jpeg2000 plugin to use libopenjpeg instead.

    formats 
    opened by rexbron 26
  • new ArgParse code does not build with VS2015

    new ArgParse code does not build with VS2015

    After commit e81036b6559 (#2531), I can no longer build on Windows using VS2015 because I get build errors of the form:

    oiio\src\oiiotool\oiiotool.cpp(5244): error C2664: 'OpenImageIO_v2_2::ArgParse::Arg &OpenImageIO_v2_2::ArgParse::Arg::action(int (__cdecl *)(int,const char **))': cannot convert argument 1 from 'void (__cdecl *)(OpenImageIO_v2_2::span<const char *const ,-1>)' to 'OpenImageIO_v2_2::ArgParse::ArgAction &&'
    oiio\src\oiiotool\oiiotool.cpp(5244): note: Reason: cannot convert from 'overloaded-function' to 'OpenImageIO_v2_2::ArgParse::ArgAction'
    oiio\src\oiiotool\oiiotool.cpp(5244): note: No constructor could take the source type, or constructor overload resolution was ambiguous
    

    Looking at the code, I can't see how this could be considered ambiguous and this should work, so I suspect a compiler bug. And in fact, if I build with VS2019 I get no error.

    I'm hoping very soon we'll be building OIIO with a newer compiler than VS2015, so in my particular case I don't think I need this fixed in OIIO. However, currently the minimum visual studio required, according to the following is 2015:

    src/include/OpenImageIO/platform.h
    # if _MSC_VER < 1900
     # error "This version of OIIO is meant to work only with Visual Studio 2015 or later"
    # endif
    

    So I think either we'd want to raise the minimum VS (I haven't tested 2017, but I do know 2019 works) or implement a temporary work-around? There's also the possibility I'm messing something up, so of course would be good if someone else could do a sanity check?

    opened by ThiagoIze 25
  • TIFF: refine logic for setting PhotometricInterpretation on output

    TIFF: refine logic for setting PhotometricInterpretation on output

    Some background: TIFF allows for pixel values to be encoded in some alternative color spaces, like YCbCr, CIELAB, etc., and this is indicated by the TIFF PhotometricInterpretation tag. Since in practice we almost never encounter these encodings in the wild, and they require a lot of custom code to handle (for example, YCbCr also comes along with the ability to subsample the chroma, and options for different placements of the subsampled positions, yuck), for most of these cases we just lean on libtiff's ability to convert the whole thing to RGBA for us, and so in that case, we return to the user the pixels as RGBA, and set the "tiff:ColorSpace" metadata just as an advisory to indicate how it had been encoded in the file. But we don't support writing any of those. (One exception is that we do allow reading and writing of CMYK files.)

    OK, but now what about a case where the app already has the data in one of these spaces (such as YCrCb; and let's ignore the whole subsampling miasma and assume we don't want to support that), and all we want to do is write that data to a TIFF file -- without any kind of data conversion -- but to set the TIFF tags properly to indicate that the data in the file is what we know it to be?

    A related special case of this is: what if we have a TIFF file that has YCbCr data but neglected to mark it as such (I'm staring daggers at a certain widely used compositing package right now), and to fix this, we want to use OIIO to just copy the file and set the right tags?

    It turns out that in the status quo, it is surprisingly difficult to do this. There is just nothing in our existing TIFF output code that will write any of those photometric tags for those spaces, and no way to communicate that this is what we desire.

    Whew. Now here's what this patch does:

    • If the "oiio:ColorSpace" attribute (our usual way to indicate presumed color space of the pixel data) says that the pixels are already in one of those color spaces (specifically, "YCbCr", "CIELAB", "ICCLAB", "ITULAB", "LOGL", "LOGLUV"), then we set the PhotometricInterpretation tag as such in the TIFF file that we write.

    • We still DO NOT interpret that as a request to convert pixel data from any other space into this one. In other words, the TIFF output does not convert color spaces (except for RGB <-> CMYK); this merely lets us output a file that correctly says the data are what the app thinks they are.

    • A bunch of minor refactoring was necessary because of some unobvious coupling and order dependencies. For example, the sgilog compression techniques MUST be used with the LOGLUV color space, and vice versa. You have to know how both should be set before checking that they are compatible, and if they are not, adjust something that it's not too late to change.

    So the punchline at the end is that if you had a TIFF file that has YCbCr encoded pixels, but for some reason it's marked as ordinary RGB, you can fix it as follows:

    oiiotool ycbcr_disguised_as_rgb.tif --iscolorspace YCbCb -o real_ycbcr.tif
    
    opened by lgritz 1
  • Additional testing and improved code coverage (and minor fixes)

    Additional testing and improved code coverage (and minor fixes)

    • Better Typedesc testing of 'tostring' with fmt style formatting commands, and fix a bug that uncovered.

    • Refine 'make CODECOV=1' behavior

    • Beef up python-imagecache test to test getpixels, more attribute, invalidate.

    • Better testing of python IB construction from numpy array.

    • testtex: Use correct guard to avoid compiling unused code for coverage analysis testtex: get rid of unused 3d warp code.

    • Add texture-threadtimes test

    • Eliminate redundant code in exroutput.c by implementing write_scanline using write_scanlines.

    opened by lgritz 0
  • Add EXIF write support to PNG output.

    Add EXIF write support to PNG output.

    Description

    Stores any EXIF data from the given ImageSpec into the PNG eXIf chunk.

    Tests

    Checklist:

    • [x] I have read the contribution guidelines.
    • [x] ~~If this is more extensive than a small change to existing code, I have previously submitted a Contributor License Agreement (individual, and if there is any way my employers might think my programming belongs to them, then also corporate).~~ Change is small enough to not require a CLA
    • [x] ~~I have updated the documentation, if applicable.~~ Not applicable I think
    • [x] I have ensured that the change is tested somewhere in the testsuite (adding new test cases if necessary).
    • [x] My code follows the prevailing code style of this project.
    opened by joris-nijs 4
  • [BUG] ImageCache doesn't invalidate if no change in modification time

    [BUG] ImageCache doesn't invalidate if no change in modification time

    Describe the bug I loaded two images from the same path. The file was changed between the two operations but since the file's modification time stayed the same (in seconds) ImageCache didn't invalidate it:

    If the change takes a longer time such that the modification time of the file, which has seconds resolution, differs for the second image load, buf2 will load from the correct, updated file and that would be the expected behaviour always.

    To Reproduce Steps to reproduce the behavior:

    std::string filePath = ...;
    // Save an image to filePath
    ImageBuf buf1(filePath);
    // Save another image to filePath
    ImageBuf buf2(filePath);
    

    Expected behavior I expect buf2 to hold the update image which is the case if the modification time is updated (in seconds) for the second operation.

    Evidence This is intentional behavior of the ImageCache as we can see it here: https://github.com/OpenImageIO/oiio/blob/003a1f15aeb4a7ee7e31c0c21c27eafc9b981f57/src/libtexture/imagecache.cpp#L3395 I don't think ignoring the changes of a file should depend on the resolution of the file time, at least not if the resolution is seconds.

    Platform information:

    • OIIO branch/version: 2.3.7.2
    • OS: macOS 12.6.2 (21G320)
    • C++ compiler: Apple clang version 14.0.0 (clang-1400.0.29.202)
    • Any non-default build flags when you build OIIO: none
    opened by tamaskenez 0
  • [BUG] Unsettable delay for animated GIFs w/proposed fix

    [BUG] Unsettable delay for animated GIFs w/proposed fix

    Describe the bug I am trying to reencode an animated GIF from an IOMemReader to an IOVecOutput. All the code for copying the images and creating the output works except that I cannot set the delay (FPS, FramesPerSecond) in the output. I've reviewed the code, and cannot see how I'm supposed to be able to set the delay without a change to the OIIO library.

    Let me walk you through the library code's logic. In gif.h the routine GifWriteLzwImage encodes the output using the argument delay. GifWriteLzwImage is called from gif.h's GifWriteFrame routine which also gets delay from an argument. GifWriteFrame is called by gifoutput.cpp's GIFOutput::finish_subimage which passes GIFOutput::m_delay. GIFOutput::m_delay only gets set in a single place, GIFOutput::open(const std::string&, int, const ImageSpec*). This open routine is where I believe the issue to be. m_delay is set using the attribute "FramesPerSecond" in m_spec. You'll notice that open gets an ImageSpec as an argument. The passed in ImageSpec is only ever used to initialize the m_subimagespecs array. The m_subimagespecs array is never used for anything, and can be removed. It's my belief that m_spec, which is used to create m_delay, is never initializable from outside the library. From outside the library you're able to control the specs argument, but that's never actually used. So I believe the fix is to use specs to initialize m_spec, and then get the "FramesPerSecond" attribute.

    To Reproduce Steps to reproduce the behavior:

    1. Run code to take https://media.tenor.com/QWAo2echlVEAAAAC/cute.gif and reencode the animated GIF with the same 0.1 second delay. That's a "FramesPerSecond" attribute of 100/10.

    Expected behavior It should be possible to use the OpenImageIO library to write an animated GIF with a non-default delay between frames.

    Evidence No matter what I do, the animated GIFs I write with OpenImageIO always encode with the default 1 seconds delay. Hopefully my code review is evidence enough, but I'd appreciate any alternate way of viewing the fix. Maybe there's another way to set m_delay or m_spec that I'm unaware of.

    Platform information:

    • OIIO branch/version: master branch commit 1449b465000bf7c83e983cf870ca7b1f2966d446
    • OS: CentOS Stream 9
    • C++ compiler: gcc version 11.3.1 20221121
    • Any non-default build flags when you build OIIO: None

    IF YOU ALREADY HAVE A CODE FIX: Here's the fix that I've tested. If there's an alternate solution, please let me know. Thank you.

    diff --git a/src/gif.imageio/gifoutput.cpp b/src/gif.imageio/gifoutput.cpp
    index e033f221..14a8c0e4 100644
    --- a/src/gif.imageio/gifoutput.cpp
    +++ b/src/gif.imageio/gifoutput.cpp
    @@ -83,7 +83,6 @@ private:
         int m_subimage;  // Current subimage index
         int m_nsubimages;
         bool m_pending_write;                    // Do we have an image buffered?
    -    std::vector<ImageSpec> m_subimagespecs;  // Saved subimage specs
         GifWriter<Filesystem::IOProxy> m_gifwriter;
         std::vector<uint8_t> m_canvas;  // Image canvas, accumulating output
         int m_delay;
    @@ -154,7 +153,9 @@ GIFOutput::open(const std::string& name, int subimages, const ImageSpec* specs)
         m_filename   = name;
         m_subimage   = 0;
         m_nsubimages = subimages;
    -    m_subimagespecs.assign(specs, specs + subimages);
    +    if (specs != nullptr) {
    +        m_spec = *specs;
    +    }
         float fps = m_spec.get_float_attribute("FramesPerSecond", 1.0f);
         m_delay   = (fps == 0.0f ? 0 : (int)(100.0f / fps));
    
    opened by GreyHak 0
  • [BUG] Three issues with build_ninja.bash

    [BUG] Three issues with build_ninja.bash

    Describe the bug

    1. https://github.com/OpenImageIO/oiio/blob/master/src/build-scripts/build_ninja.bash#L13 performs a check to see if a .zip file exists. If it doesn't a .tar.gz file is downloaded. Either way a .tar.gz file is extracted. The check should be for the existance of a .tar.gz file, not a .zip file.
    2. The path of the file downloaded https://github.com/ninja-build/ninja/archive/v1.10.2.tar.gz, no longer aligned with GitHub's release file structure. The download is now available at https://github.com/ninja-build/ninja/archive/refs/tags/v1.10.2.tar.gz. "refs/tags" needs to be added.

    To Reproduce Steps to reproduce the behavior:

    1. Run src/build-scripts/build_ninja.bash
    2. Or run src/build-scripts/build_ninja.bash with oiio/ext/downloads/ninja-1.10.2.zip already present. You can download it from https://github.com/ninja-build/ninja/archive/refs/tags/v1.10.2.zip

    Expected behavior If the .zip file is present, but the .tar.gz file is not, the script will attempt to untar the nonexistent file and fail. If neither file is present, the script will attempt to download the .tar.gz file file from the wrong location and fail.

    Evidence

    + LOCAL_DEPS_DIR=/home/cent/git/external/oiio/ext
    + DOWNLOADS_DIR=/home/cent/git/external/oiio/ext/downloads
    + NINJA_REPO=https://github.com/ninja-build/ninja
    + NINJA_VERSION=1.10.2
    + NINJA_BRANCH=v1.10.2
    + NINJA_INSTALL_DIR=/home/cent/git/external/oiio/ext/dist/bin
    + '[' '!' -f /home/cent/git/external/oiio/ext/downloads/ninja-1.10.2.zip ']'
    + curl --location https://github.com/ninja-build/ninja/archive/v1.10.2.tar.gz -o /home/cent/git/external/oiio/ext/downloads/ninja-v1.10.2.tar.gz
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
      0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0Warning: Failed to create the file
    Warning: /home/cent/git/external/oiio/ext/downloads/ninja-v1.10.2.tar.gz: No
    Warning: such file or directory
      0  208k    0   512    0     0    773      0  0:04:36 --:--:--  0:04:36  2327
    curl: (23) Failure writing output to destination
    

    Platform information:

    • OIIO branch/version: commit 1449b465000bf7c83e983cf870ca7b1f2966d446 (HEAD -> master, origin/master, origin/HEAD)
    • OS: CentOS Stream release 9
    • C++ compiler: g++ 11.3.1 20221121
    • Any non-default build flags when you build OIIO: No. Not getting that far.
    opened by GreyHak 1
Releases(v2.4.7.1)
  • v2.4.7.1(Jan 4, 2023)

    Release 2.4.7.1 (3 Jan 2023) -- compared to 2.4.7.0

    • Fix build break for Mac ARM. #3735
    • CMake config should not include a find of fmt if it's internalized. #3739
    Source code(tar.gz)
    Source code(zip)
  • v2.4.7.0(Jan 1, 2023)

    Release 2.4.7.0 (1 Jan 2023) -- compared to 2.4.6.0

    • IOMemReader detects and errors for out-of-range read positions. #3712
    • Build/Mac: Suppress some deprecation warnings when building wth the newest Apple clang. #3709 #3710
    • ARM: Fix signed/unsigned SIMD mismatch in vbool4::load. #3722
    • Build: New CMake variable INTERNALIZE_FMT, when set to OFF will ensure that the fmt headers are not internalized (copied to the installed part of OIIO). The default is ON, matching old behavior. #3598
    • Testing: Improved testing of iinfo #3688 #3706, 'term' output #3714, igrep #3715.
    • build_openexr.bash: bump default version of OpenEXR/Imath retrieved to be 3.1.5. #3703
    • span.h: Make sure the cspan alias also allows the Extent template argument; add a custom formatter to print spans. #3685
    • ustring.h: #if guards to let the header be Cuda-safe. #3718
    • Internals: refactoring to remove duplicated code for iinfo and oiiotool --info. #3688
    • Internals: remove the last instances of unsafe std::sprintf. #3705
    Source code(tar.gz)
    Source code(zip)
  • v2.4.6.0(Dec 3, 2022)

    Release 2.4.6 (1 Dec 2022) -- compared to 2.4.5.0

    • make_texture / maketx : ensure proper setting of certain metadata when using a texture as a source to build another texture. #3634
    • Build: Make sure use of ${PROJECT_NAME} doesn't occur before the call to project(). #3651
    • Fix null pointer dereference when OCIO no configuration is found. #3652
    • Support for building against OpenColorIO 2.2. #3662
    • Fixes to subtle bugs when ImageBuf is used with IOProxy. #3666
    • oiiotool: Fix problems with --point when there is no alpha channel. #3684
    • oiiotool: --dumpdata fix channel name output. #3687
    • BMP: Fix possible write errors, fixes TALOS-2022-1653 / CVE-2022-43594, CVE-2022-43595. #3673
    • DPX: Fix possible write errors, fixes TALOS-2022-1651 / CVE-2022-43592 and TALOS-2022-1652 / CVE-2022-43593. #3672
    • IFF files: Add IOProxy support. #3647
    • IFF: Fix possible write errors, fixes TALOS-2022-1654 / CVE-2022-43596, TALOS-2022-1655 / CVE-2022-43597 CVE-2022-43598, TALOS-2022-1656 / CVE-2022-43599 CVE-2022-43602 #3676
    • PSD: Fix thumbnail extraction. #3668
    • PSD: when reading, don't reject padded thumbnails. #3677
    • Raw: Update Exif orientation if user flip is set. #3669
    • Zfile write safety, fixes TALOS-2022-1657 / CVE-2022-43603. #3670
    • filesystem.h: new Filesystem::is_executable() and find_program(). #3638
    • filesystem.h: Change IOMemReader constructor to take a const buffer pointer. #3665
    • strutil.h: new trimmed_whitspace(). #3636
    • New OIIO::print() exposes Strutil::print() in the main OIIO namespace. #3667
    • Testing: improved testing of oiiotool #3637 #3643 #3649, Strutil #3655
    Source code(tar.gz)
    Source code(zip)
  • v2.4.5.0(Nov 1, 2022)

    Release 2.4.5 (1 Nov 2022) -- compared to 2.4.4.2

    • oiiotool: new commands --iccread reads a named file and adds its contents as the ICCProfile metadata of the top image, --iccwrite saves the ICCProfile metadata of the top file to a named file. #3550
    • TIFF, JPEG, JPEG-2000, PNG, and PSD files containing ICC profiles now extract and report extra metadata related to aspects of those profiles. #3554
    • Python: support int8[] metadata and retrieving the ICCPorofile metadata. #3556
    • oiiotool: New expression syntax for retrieving metadata {TOP[foo]} is similar to the existing {TOP.foo}, if there is no foo metadata found, the former evaluates to an empty string, whereas the latter is an error. #3619
    • Strutil: new utf16_to_utf8(const std::u16string&) and Strutil::utf8_to_utf16wstring(). #3553
    • ustring: make std::hash work for ustring, add operator< for ustringhash, add from_hash() to ustringhash, make ustringhash == and != be constexpr for C++17 and beyond. #3577 Custom fmt formatter for ustringhash that prints the string rather than the hash. #3614
    • Build: the version number is now a CMake cache variable that can be overridden (caveat emptor). #3549
    • Build/security: New CMake cache variable FORTIFY_SOURCE, if enabled, builds with the specified gcc _FORTIFY_SOURCE option defined. This may be desirable for people deploying OIIO in security-sensitive environments. #3575
    • CI: testing now includes using undefined behavior sanitizer. #3565
    • Windows: protect against OpenEXR thread deadlock on shutdown. #3582
    • Windows: Work around a static destruction order issue. #3591
    • Windows: define NOGDI to keep the inclusion of windows.h from adding as many unneeded symbols. #3596
    • MinGW: fix incorrect symbol visibility issue for ImageBuf iterators. #3578
    • ARM: improve SIMD operations for ARM NEON. #3599
    • Docs: New RELEASING.md documents our releasing procedures. #3564 #3580
    • Docs: Better Windows build instructions in INSTALL.md. #3602
    • Fix missing OIIO::getattribute support for limits:channels and limits:imagesize_MB. #3617
    • BMP: fix reading 16bpp images. #3592
    • BMP: protect against corrupt pixel coordinates. (TALOS-2022-1630, CVE-2022-38143) #3620
    • DDS: fix alpha/luminance files, better testing. #3581
    • DDS: optimize loading of compressed images, improves 3-5x. #3583 #3584
    • DDS: Fix crashes for cubemap files when a cube face was not present, and check for invalid bits per pixel. (TALOS-2022-1634, CVE-2022-41838) (TALOS-2022-1635, CVE-2022-41999) #3625
    • HDR: fix a 8x (!) read performance regression for HDR files that was introduced in OIIO in 2.4. #3588 On top of that, speed up by another 4x beyond what we ever did before by speeding up the RGBE->float conversion. #3590
    • PNG: fix memory leaks when errors take an early exit. #3543 #3544
    • PSD: fix a PSD read error on ARM architecture. #3589
    • PSD: protect against corrupted embedded thumbnails. (TALOS-2022-1626, CVE-2022-41794) #3629
    • RAW: additional color metadata is now recognized: pre_mul, cam_mul, cam_xyz, rgb_cam. #3561 #3569 #3572
    • RLA: fix potential buffer overrun. (TALOS-2022-1629, CVE-2022-36354) #3624
    • Targa: string overflow safety. (TALOS-2022-1628, CVE-2022-4198) #3622
    • TIFF/JPEG/PSD: Fix EXIF bugs where corrupted exif blocks could overrun memory. (TALOS-2022-1626, CVE-2022-41794) (TALOS-2022-1632, CVE-2022-41684) #3627
    • TIFF: guard against corrupt files with buffer overflows. (TALOS-2022-1627, CVE-2022-41977) #3628
    • TIFF: guard against buffer overflow for certain CMYK files. (TALOS-2022-1633, CVE-2022-41639) (TALOS-2022-1643, CVE-2022-41988) #3632
    Source code(tar.gz)
    Source code(zip)
  • v2.3.21.0(Nov 1, 2022)

    Release 2.3.21 (1 Nov 2022) -- compared to 2.3.20

    • oiiotool: protect against OpenEXR thread deadlock on Windows. #3582
    • oiiotool: work around static destruction order issue. #3591
    • Fix PSD import on ARM. #3589
    • Docs: write Windows build instructions in INSTALL.md. #3602
    • RLA: fix potential buffer overrun. (TALOS-2022-1629, CVE-2022-36354) #3624
    • TIFF: guard against corrupt files with buffer overflows. (TALOS-2022-1627, CVE-2022-41977) #3628
    • TIFF: guard against buffer overflow for certain CMYK files. (TALOS-2022-1633, CVE-2022-41639) (TALOS-2022-1643, CVE-2022-41988) #3632
    Source code(tar.gz)
    Source code(zip)
  • v2.4.4.2(Oct 3, 2022)

    Release 2.4.4.2 (3 Oct 2022) -- compared to 2.4.4.1

    • DDS: Improved support for DTX5, ATI2/BC5 normal maps, R10G10B10A2 format, RXGB, BC4U, BC5U, A8, improved low bit expansion to 8 bits. #3573 (2.4.4.2)
    • DDS: Fix possible heap overflow on input. #3542 (2.4.4.2)
    Source code(tar.gz)
    Source code(zip)
  • v2.4.4.1(Oct 1, 2022)

    OpenImageIO version 2.4 has been released! Officially tagged as "v2.4.4.1", we have also moved the "release" branch tag to this position. Henceforth, 2.4 is the supported production release family. The API is now frozen -- we promise that subsequent 2.4.x releases (which should happen monthly) will not break back-compatibility of API, ABI, or linkage, compared to this release. Please note that this release is not ABI or link compatible with 2.3 or older releases (and not necessarily with earlier in-progress 2.4 development before this release).

    Release notes for 2.4 outlining all the changes since last year's release are below.

    Please note that a few of the build and runtime dependencies have changed their minimum supported versions. OpenEXR versions 2.0, 2.1, and 2.2 are no longer supported, 2.3 is now the minimum. Field3D is now no longer supported as a volume data format, as it is no longer actively maintained and everybody seems to have switched to OpenVDB for volume data.

    Enjoy, and please report any problems. We will continue to make patch releases to the 2.4 family roughly monthly, which will contain bug fixes and non-breaking enhancements.

    The older 2.3 series of releases is now considered obsolete. We will continue for now to make 2.3 patch releases, but over time, these will become less frequent and be reserved for only the most critical bug fixes.

    The "master" branch is now progressing toward an eventual 2.5 release next summer. As usual, you are welcome to use master for real work, but we do not make any compatibility guarantees and don't guarantee continuing API compatibility in master.

    Release 2.4 (1 Oct 2022) -- compared to 2.3

    New minimum dependencies and compatibility changes:

    • OpenEXR minimum is now 2.3 (raised from 2.0). #3109 (2.4.0)
    • Field3D support has been removed entirely. The Field3D library appears to be no longer maintained, and is incompatible with modern versions of OpenEXR/Imath. We believe that all prior uses of Field3D use via OIIO have been migrated to OpenVDB. #3151 (2.4.0)

    New major features and public API changes:

    • Imath header and class hiding:
      • Header includes have been shuffled around so that Imath headers are not included from OIIO headers where they are not needed, and some OIIO headers that need Imath types only for few function parameters now guard those functions with #if so that Imath-taking functions are not visible unless the calling app has previously had an #include of Imath. If your app uses Imath types but did not include the right Imath headers (relying on the accidental fact of other OIIO headers transitively including them), you may need to adjust your includes. #3301 #3332 (2.4.0.2) #3406 #3474 (2.4.2)
      • New V3fParam, M33fParam, and M44fParam (defined in vecparam.h) are used just for parameter passing in public APIs, instead of Imath::V3f, M33f, or M44f, in order to more fully hide Imath types from our public interfaces. These are only parameter-passing classes, and are not useful as vector or matrix classes in their own right. But they seamlessly cast to and from other vector- and matrix-like classes. #3330 (2.4.1.0)
      • OPENIMAGEIO_IMATH_DEPENDENCY_VISIBILITY is a new CMake cache variable at OIIO build time that controls whether the Imath library dependencies will be declared as PUBLIC (default) or PRIVATE target dependencies of libOpenImageIO and libOpenImageIO_Util. #3322 (4.2.0.2) #3339 (4.2.0.3)
      • For downstream projects that consume OIIO's exported cmake config files, setting CMake variable OPENIMAGEIO_CONFIG_DO_NOT_FIND_IMATH to ON will skip the find_depencency() calls for Imath and OpenEXR. To clarify, this is not a variable that has any effect when building OIIO, it's something set in the downstream project itself. #3322 (4.2.0.2)
    • The dithering that happens when saving high bit depth image data to low bit depth formats has been improved in several ways. It now applies when writing

      8 bit data to <= 8 bit files, not just when the source is float or half. The dither pattern is now based on blue noise, and this dramatically improves the visual appearance. #3141 (2.4.0/2.3.10)

    • TextureSystem now supports stochastic sampling. If the new TextureOpt field rnd (which now defaults to -1.0) is set to a value >= 0, the filtered texture lookup can use stochastic sampling to save work. The shading system attribute "stochastic" is set to the stochastic strategy: 0 = no stochastic sampling; 1 = for trilinear or anisotropic MIP modes, choose one MIP level stochastically instead of blending between two levels; 2 = for anisotropic mode, use just one anisotropic sample, chosen across the filter axis. (This is a bit field, so 3 combines both strategies.) We measure this speeding up texture lookups by 25-40%, though with more visual noise (which should be resolved cleanly by a renderer that uses many samples per pixel). This should only used for texture lookups where many samples per pixel will be combined, such as for surface or light shading. It should not be used for texture lookups that must return a single correct value (such as for displacement, when each grid position is sampled only once). Even when the "stochastic" attribute is nonzero, any individual texture call may be made non-stochastic by setting TextureOpt.rnd to a negative value. #3127 (2.4.0/2.3.10) #3457 (2.4.2)
    • maketx/make_texture() now supports options to store Gaussian forward and inverse transform lookup tables in image metadata (must be OpenEXR textures for this to work) to aid writing shaders that use histogram-preserving blending of texture tiling. This is controlled by new maketx arguments --cdf, --cdfsigma, --sdfbits, or for IBA::make_texture() by using hints maketx:cdf, maketx:cdfsigma, and maketx:cdfbits. #3159 #3206 (2.4.0/2.3.10)
    • oiiotool new commands and features:
      • Control flow via --if, --else, --endif, --while, --endwhile, --for, --endfor let you prototypes conditional execution and loops in the command sequence. #3242 (2.4.0)
      • --set can set variables and their values can be retrieved in expressions. #3242 (2.4.0)
      • Expressions now support: numerical comparisons via <, >, <=, >=, ==, !=, <=>; logical operators &&, ||, !, not(); string comparison functions eq(a,b) and neq(). #3242 #3243 (2.4.0)
      • --oiioattrib can set "global" OIIO control attributes for an oiiotool run (equivalent of calling OIIO::attribute()). #3171 (2.4.0/2.3.10)
      • --repremult exposes the previously existing IBA::repremult(). The guidance here is that --premult should be used for one-time conversion of "unassociated alpha/unpremultiplied color" to associated/premultiplied, but when you are starting with a premultiplied image and have a sequence of unpremultiply, doing some adjustment in unpremultiplied space, then re-premultiplying, it's --repremult you want as the last step, because it preserves alpha = 0, color > 0 data without crushing it to black. #3192 (2.4.0/2.3.10)
      • --saturate can adjust saturation level of a color image. #3190 (2.4.0/2.3.10)
      • --maxchan and --minchan turn an N-channel image into a 1-channel images that for each pixel, contains the maximum value in any channel of the original for that pixel. #3198 (2.4.0/2.3.10)
      • --point lets you color one or more pixels in an image (analogous to IBA::render_point). #3256 (2.4.0)
      • --warp now takes an optional modifier :wrap=... that lets you set which wrap mode to use when sampling past the edge of the source image. #3341 (2.4.0.3)
      • New --st_warp performs warping of an image where a second image gives the (s,t) coordinates to look up from at every pixel. #3379 (2.4.2/2.3.14)
      • Many attribute actions now take optional modifier :subimages= that instructs oiiotool to apply to a particular subset of subimges in multi-subimage files (such as multi-part exr). The commands so enabled include --attrib, --sattrib, --eraseattrib, --caption, --orientation, --clear-keywords, --iscolorspace. The default, if subimages are not specified, is to only change the attributes of the first subimage, unless -a is used, in which case the default is to change the attributes of all subimages. #3384 (2.4.2)
    • ImageSpec :
      • New constructors to accept a string for the data type. #3245 (2.4.0/2.3.12)
    • ImageBuf/ImageBufAlgo :
      • IBA::saturate() can adjust saturation level of a color image. #3190 (2.4.0/2.3.10)
      • IBA::maxchan() and minchan() turn an N-channel image into a 1-channel images that for each pixel, contains the maximum value in any channel of the original for that pixel. #3198 (2.4.0/2.3.10)
      • New IBA::st_warp() performs warping of an image where a second image gives the (s,t) coordinates to look up from at every pixel. #3379 (2.4.2/2.3.14)
      • IBA::bluenoise_image() returns a reference to a periodic blue noise image. #3141 #3254 (2.4.0/2.3.10)
    • ImageCache / TextureSystem :
      • IC/TS both have added a getattributetype() method, which retrieves just the type of a named attribute. #3559 (2.4.4.0)
    • Python bindings:
      • New ImageBuf constructor and reset() from a NumPy array only -- it deduces the resolution, channels, and data type from the array dimensions and type. #3246 (2.4.0/2.3.12)
      • ROI now has a working copy() method. #3253 (2.4.0/2.3.12)
      • ImageSpec and ParamValueList now support 'key' in spec, del spec['key'], and spec.get('key', defaultval) to more fully emulate Python dict syntax for manipulating metadata. #3252 (2.3.12/2.4.0)
      • Support uint8 array attributes in and out. This enables the proper Python access to "ICCProfile" metadata. #3378 (2.4.1.0/2.3.14)
      • New ImageSpec.get_bytes_attribute() method is for string attributes, but in Python3, skips decoding the underlying C string as UTF-8 and returns a bytes object containing the raw byte string. #3396 (2.4.2)
      • Fixes for Python 3.8+ to ensure that it can find the OpenImageIO module as long as it's somewhere in the PATH. This behavior can be disabled by setting environment variable OIIO_LOAD_DLLS_FROM_PATH=0. #3470 (2.4.0/2.3.18)
    • New global OIIO attributes:
      • "try_all_readers" can be set to 0 if you want to override the default behavior and specifically NOT try any format readers that don't match the file extension of an input image (usually, it will try that one first, but it if fails to open the file, all known file readers will be tried in case the file is just misnamed, but sometimes you don't want it to do that). #3172 (2.4.0/2.3.10)
      • "use_tbb" if nonzero, and if OIIO was built with TBB enabled and found, then will use the TBB thread pool instead of the OIIO internal thread pool. #3473 (2.4.2.2)
      • "version" (read only) now retrieves the version string. #3534 (2.3.19.0/2.4.2.2)
    • Full IOProxy support has been added to TIFF #3075 (2.4.0/2.3.8), JPEG, GIF #3181 #3182 (2.4.0/2.3.10), DDS #3217, PNM #3219, PSD #3220, Targa #3221, WebP #3224, BMP #3223, JPEG-2000 #3226 (2.4.0).
    • Convention change: Image readers who wish to convey that the color space of an input image is a simple gamma-corrected space will now call the color space "GammaX.Y" (previously we sometimes used this, but sometimes called it "GammaCorrectedX.Y"). #3202 (2.4.0)
    • oiioversion.h now defines symbols OIIO_USING_IMATH_VERSION_MAJOR and OIIO_USING_IMATH_VERSION_MINOR that reveal which Imath version was used internally to OIIO when it was built (which may be different than the version found when the downstream app is being compiled). #3305 (2.4.0.1)
    • Most of the major APIs (including ImageInput, ImageOutput, and ImageBuf) that took a std::string or string_view to indicate a filename (assumed to support UTF-8 encoding of Unicode filenames) now have additional versions that directly take a std::wstring, thus supporting UTF-16 Unicode filenames as "wide strings". #3312 #3318 (2.4.0.1)
    • The ColorConfig API adds new calls getDisplayViewColorSpaceName() and getDisplayViewLooks() that expose the underlying OpenColorIO functionality. #3319 (2.4.0.2)
    • Many long-deprecated functions in imageio.h and imagbufalgo.h are now marked as OIIO_DEPRECATED, and therefore may start to generate warnings if used by downstream software. #3328 (2.4.1.0)

    Performance improvements:

    • Raise the default ImageCache default tile cache from 256MB to 1GB. This should improve performance for some operations involving large images or images with many channels. #3180 (2.4.0/2.3.10)
    • Performance of JPEG-2000 I/O is improved by 2-3x due to multithreading, but only if you are using a sufficiently new version of OpenJPEG (2.2 for encoding, 2.4 for decoding). #2225 (2.3.11/2.4.0)
    • Dramatically speed up (50-100x) the implementation of Strutil iequals, iless, starts_with, istarts_with, ends_with, iends_with. This in turn speeds up ParamValueList find/get related methods, ImageSpec find/get methods, and TS::get_texture_info. #3388 (2.4.1.1)
    • Renderer users of the TextureSystem might see up to a ~40% speedup if using the new stochastic sampling features. #3127 #3457
    • Speed up reading of uncompressed DDS images by about 3x. #3463 (2.4.2.0)

    Fixes and feature enhancements:

    • ImageSpec:
      • Implemented deserialization of extra_attribs from XML. #3066 (2.4.0/2.3.8)
      • Allow getattribute("format") to retrieve the name of the pixel data type. #3247 (2.4.0)
    • ImageInput / ImageOutput:
      • Protected methods that make it easier to implement support for IOProxy in image readers and writers. #3231 (2.4.0)
      • Fix crash when ioproxy is passed to a plugin that doesn't support it. #3453 (2.4.2)
    • ImageBuf / ImageBufAlgo:
      • Fix ImageBuf::read bug for images of mixed per-channel data types. #3088 (2.4.0/2.3.8)
      • IBA::noise() now takes "blue" as a noise name. Also, "white" is now the preferred name for what used to be "uniform" (which still works as a synonym). #3141 (2.4.0/2.3.10)
      • Refactor ImageBuf::Iterator, ConstIterator templates, reduces compile time substantially. #3195 (2.4.0)
      • IBA functions taking a cspan<> now more flexibly can be passed an init list like { 0.2f, 0.4f, 0.5f } instead of needing to wrap it in a cspan<float>() constructor. #3257 (2.3.12/2.4.0)
      • make_texture(): ensure that "maketx:ignore_unassoc" is honored. #3269 (2.4.0.1/2.3.12)
      • IBA::computePixelStats() improved precision. #3353 (2.4.1.0/2.3.14)
      • IBA::isConstantColor() is faster -- now if one thread finds its portion not constant, it can signal the other threads to stop immediately instead of completing their regions. #3383 (2.4.1.1)
      • A new flavor of IBA::compare() allows relative as well as absolute error thresholds. #3508 (2.3.19.0/2.4.2.2)
    • ImageCache / TextureSystem / maketx:
      • When textures are created with the "monochrome_detect" feature enabled, which turns RGB textures where all channels are always equal into true single channel greyscale, the single channel that results is now correctly named "Y" instead of leaving it as "R" (it's not red, it's luminance). #3205 (2.4.0/2.3.10)
      • Enhance safety/correctness for untiled images that exceed 2GB size (there was an integer overflow problem in computing offsets within tiles). #3232 (2.3.11/2.4.0)
      • Improve error propagation from ImageCache to higher levels, especially for tile-reading errors encountered during ImageBuf iterator use, and ImageCache errors encountered when using the TextureSystem. #3233 (2.4.0)
      • Support an additional UDIM pattern <UVTILE>, which is specified by MaterialX. #3280 #3285 (2.3.12/2.4.0.1)
      • Add support for UDIM pattern <uvtile> (used by Clarisse & V-Ray). #3358 (2.4.1.0/2.3.14)
      • The maketx --handed option, or oiiotool -attrib -otex:handed=..., or adding "handed" metadata to the configuration ImageSpec being passed to IBA::make_texture() is now supported for communicating the handedness of a vector displacement or normal map. #3331 (2.4.0.2)
      • Speed up UDIM lookups by eliminating internal mutex. #3417 (2.4.0)
      • TextureSystem: Fix typo that prevented "max_tile_channels" attribute from being set or retrieved. (2.4.2/2.3.17)
    • oiiotool:
      • --ch now has virtually no expense if the arguments require no change to the channel order or naming (previously, it would always incur an image allocation and copy even if no real work needed to be done). #3068 (2.4.0/2.3.8)
      • --ch now warns if you specify a channel name that was not present in the input image. #3290 (2.4.0.1)
      • --runstats timing report has been improved and now more accurately attributes time to each operation. In particular, input I/O is now credited to "-i" rather than being incorrectly attributed to the other ops that happen to trigger I/O of previously mentioned files. #3073 (2.4.0/2.3.8)
      • Allow quotes in command modifiers. #3112 (2.4.0/2.3.9)
      • Fix --dumpdata getting the formatting of floating point values wrong. #3131 (2.4.0/2.3.9)
      • --dumpdata:C=name causes the dumped image data to be formatted with the syntax of a C array. #3136 (2.4.0/2.3.9)
      • --noise now takes "blue" as an additional noise type. #3141 (2.4.0/2.3.10)
      • -d now accepts "uint1", "uint2", "uint4", and "uint6" for formats that support such low bit depths (TIFF). #3141 (2.4.0/2.3.10)
      • --invert fixed to avoid losing the alpha channel values. #3191 (2.4.0/2.3.10)
      • Fix bug when autocropping output images when the entire pixel data window is in the negative coordinate region. #3164 (2.4.0/2.3.10)
      • Improved detection of file reading failures. #3165 (2.4.0/2.3.10)
      • All commands that do filtering (--rotate, --warp, --reize, --fit, and --pixelaspect) now accept optional modifier :highlightcomp=1 to enable "highlight compensation" to avoid ringing artifacts in HDR images with very high-contrast regions. #3239 (2.4.0)
      • --pattern checker behavior has changed slightly: if the optional modifier :width= is specified but :height= is not, the height will be equal to the width. #3255 (2.4.0)
      • --pixelaspect fixes setting of the "PixelAspectRatio", "XResolution", and "YResolution" metadata, they were not set properly before. #3340 (2.4.0.3)
      • Fix bug that prevented metadata from being able to print as XML. #3499 (2.4.2.2)
      • i:ch=... fixes crashes, and also improves the warning message in cases where the requested channels don't exist in the source image. #3513 (2.4.2.2)
    • Python bindings:
      • Subtle/asymptomatic bugs fixed in ImageBufAlgo.color_range_check() and histogram() due to incorrect release of the GIL. #3074 (2.4.0)
      • Bug fix for ImageBufAlgo.clamp(): when just a float was passed for the min or max, it only clamped the first channel instead of all channels. #3265 (2.3.12/2.4.0)
      • Fix the ability to getattribute() of int64 and uint64 metadata or attributes. #3555 (2.4.4.0)
    • idiff:
      • --allowfailures allows that number of failed pixels of any magnitude. #3455 (2.4.2)
      • --failrelative and --warnrelative allows the failure and warning threshold to use a symmetric mean relative error (rather than the absolute error implied by the existing --fail and --warn arguments). #3508 (2.3.19.0, 2.4.2.2)
    • BMP:
      • IOProxy support. #3223 (2.4.0)
      • Support for additional (not exactly fully documented) varieties used by some Adobe apps. #3375 (2.4.1.0/2.3.14)
      • Better detection of corrupted files with nonsensical image dimensions or total size. #3434 (2.4.2/2.3.17/2.2.21)
      • Protect against corrupted files that have palette indices out of bound. #3435 (2.4.2/2.3.17/2.2.21)
    • DDS:
      • Don't set "texturetype" metadata, it should always have been only "textureformat". Also, add unit testing of DDS to the testsuite. #3200 (2.4.0/2.3.10)
      • IOProxy support. #3217 (2.4.0)
      • Add support for BC4-BC7 compression methods. #3459 (2.4.2)
      • Speed up reading of uncompressed DDS images (by about 3x). #3463
      • Better handling of cube maps with MIPmap levels. #3467 (2.4.0)
      • For 2-channel DDS files, label them as Y,A if the flags indicate luminance and/or alpha, otherwise label them as R,G. #3530 (2.4.2.2)
      • Do not set "oiio:BitsPerSample" for cases where the dds.fmt.bpp field is not assumed to be valid. MS docs say it's valid only if the flags field indicates RGB, LUMINANCE, or YUV types. #3530 (2.4.2.2)
    • FFMpeg
      • Now uses case-insensitive tests on file extensions, so does not get confused on Windows with all-caps filenames. #3364 (2.4.1.0/2.3.14)
      • Take care against possible double-free of allocated memory crash upon destruction. #3376 (2.4.1.0/2.3.14)
    • GIF
      • IOProxy support. #3181 (2.4.0/2.3.10)
    • HDR:
      • IOProxy support. #3218 (2.4.0)
    • HEIF:
      • Handle images with unassociated alpha. #3146 (2.4.0/2.3.9)
    • JPEG:
      • IOProxy support. #3182 (2.4.0/2.3.10)
      • Better handling of PixelAspectRatio. #3366 (2.4.1.0)
      • Fix multithreaded race condition in read_native_scanline. #3495 (2.4.2.2)
      • Fix bug in XRes,YRes aspect ratio logic. #3500 (2.4.2.2)
      • When asked to output 2-channel images (which JPEG doesn't support), use the channel names to decide whether to drop the second channel (if it seems to be a luminance/alpha image) or add a third black channel (other cases). #3531 (2.4.2.2)
    • JPEG2000:
      • Enable multithreading for decoding (if using OpenJPEG >= 2.2) and encoding (if using OpenJPEG >= 2.4). This speeds up JPEG-2000 I/O by 3-4x. #2225 (2.3.11/2.4.0)
      • IOProxy support. #3226 (2.4.0)
      • Better detection and error reporting of failure to open the file. #3440 (2.4.2)
    • OpenEXR:
      • When building against OpenEXR 3.1+ and when the global OIIO attribute "openexr:core" is set to nonzero, do more efficient multithreaded reading of OpenEXR files. #3107 (2.4.0/2.3.9.1)
      • Fix excessive memory usage when saving EXR files with many channels. #3176 (2.4.0/2.3.10)
      • When building against OpenEXR >= 3.1.3, our OpenEXR output now supports specifying the zip compression level (for example, by passing the "compression" metadata as "zip:4"). Also note than when using OpenEXR >= 3.1.3, the default zip compression has been changed from 6 to 4, which writes compressed files significantly (tens of percent) faster, but only increases compressed file size by 1-2%. #3157 (2.4.0/2.3.10) Fixes in #3387 (2.4.1.1)
      • Fix writing deep exrs when buffer datatype doesn't match the file. #3369 (2.4.1.0/2.3.14)
    • PNG:
      • Assume sRGB color space as default when no color space attribute is in the file. #3321 (2.4.0.2/2.3.13)
      • Improve error detection and propagation for corrupt/broken files. #3442 (2.4.2)
      • Improve error detection and messages when writing PNG files, for various kinds of errors involving metadata. #3535 (2.4.2.2)
    • PPM:
      • Mark all PPM files as Rec709 color space, which they are by specification. #3321 (2.4.0.2/2.3.13)
    • PSD:
      • IOProxy support. #3220 (2.4.0)
      • Better error messages for corrupted files and other failures. #3469 (2.4.0)
    • RAW:
      • When using libraw 0.21+, now support new color space names "DCE-P3", "Rec2020", and "sRGB-linear", and "ProPhoto-linear". Fix incorrect gamma values for "ProPhoto". #3123 #3153 (2.4.0/2.3.9.1)
    • RLA:
      • Better guards against malformed input. #3163 (2.4.0/2.3.10)
    • Targa:
      • Improved error detection for read errors and corrupted files. #3120 (2.4.0/2.3.9.1) #3162 (2.4.0/2.3.10)
      • Fixed bug when reading x-flipped images. #3162 (2.4.0/2.3.10)
      • IOProxy support. #3221 (2.4.0)
      • Better interpretation of TGA 1.0 files with alpha that is zero everywhere. Be more consistent with Targa attributes all being called "targa:foo". Add "targa:version" to reveal whether the file was TGA 1.0 or 2.0 version of the format. #3279 (2.4.0.1/2.3.12)
      • Fix parsing of TGA 2.0 extension area when the software name was missing form the header. #3323 (2.4.0.2/2.3.13)
      • Fix reading of tiny 1x1 2-bpp Targa 1.0 images. #3433 (2.3.17/2.2.21)
    • Socket imageio plugin has been removed entirely, it never was completed or did anything useful. #3527 (2.3.2.2)
    • TIFF:
      • IOProxy is now supported for TIFF output. #3075 (2.4.0/2.3.8)
      • Honor zip compression quality request when writing TIFF. #3110 (2.4.0/2.3.11)
      • Automatically switch to "bigtiff" format for really big (> 4GB) images. #3158 (2.4.0)
      • Support for palette images with 16 bit palette indices. #3262 (2.4.0/2.3.12)
      • Gracefully handle missing ExtraSamples tag. #3287 (2.4.0.1/2.3.12)
      • New output configuration hint: "tiff:write_extrasamples" (default: 1), if set to 0, will cause the TIFF output to NOT include the required EXTRASAMPLES tag in the header. This is not recommended, but fixes a specific problem in some circumstances where PhotoShop misbehaves when the extrasamples tag is present. #3289 (2.4.0.1)
      • No longer write IPTC blocks to the TIFF header by default, it caused trouble and was sometimes corrupted. You can force it to write an IPTC block by using the output open configuration hint "tiff:write_iptc" set to nonzero. #3302 (2.4.0.1)
      • Fix read problems with TIFF files with non-zero y offset. #3419 (2.3.17/2.4.2)
      • Fixed some longstanding issues with IPTC data in the headers. #3465 (2.4.0)
      • Protect against crashes with certain empty string attributes. #3491 (2.4.2.1)
    • WebP:
      • Fix previous failure to properly set the "oiio:LoopCount" metadata when reading animated webp images. #3183 (2.4.0/2.3.10)
      • IOProxy support. #3224 (2.4.0)
    • Better catching of exceptions thrown by OCIO 1.x if it encounters 2.0 config files. #3089 (2.4.0/2.3.9)
    • Improved internal logic and error reporting of missing OCIO configs. #3092 #3095
    • Improved finding of fonts (by IBA::render_text and oiiotool --text). It now honors environment variable $OPENIMAGEIO_FONTS and global OIIO attribute "font_searchpath" to list directories to be searched when fonts are needed. #3096 (2.4.0/2.3.8)
    • Fix crash that could happen with invalidly numbered UDIM files. #3116 (2.4.0/2.3.9)
    • Fix possible bad data alignment and SIMD assumptions inside TextureSystems internals. #3145 (2.4.0/2.3.9)
    • Update internal stb_printf implementation (avoids some sanitizer alerts). #3160 (2.4.0/2.3.10)
    • Replace the few remaining instances of sscanf in the codebase with Strutil utilities that are guaranteed to be locale-independent. #3178 (2.4.0)
    • Security: New global OIIO attributes "limits:channels" (default: 1024) and "limits:imagesize_MB" (default: 32768, or 32 GB) are intended to reject input files that exceed these limits, on the assumption that they are either corrupt or maliciously constructed, and would, if read, lead to absurd allocations, crashes, or other mayhem. Apps may lower or raise these limits if they know that a legitimate input image exceeds these limits. Currently, only the TIFF reader checks these limits, but others will be modified to honor the limits over time. #3230 (2.3.11/2.4.0)
    • Fix integer overflow warnings. #3329 (2.4.1.0)
    • Improved behavior when opening a file whose format doesn't correctly match its extension: try common formats first, rather than alphabetically; and improve error messages. #3400 (2.4.2)
    • The maximum number of threads you can set with option "oiio:threads" has been increased from 256 to 512. #3484 (2.4.2.1)
    • Make access to the internal imageio_mutex not be recursive. #3489 (2.4.2.2)
    • Various protections against string metadata found in file that has zero length. #3493 (2.4.2.2)
    • Fix possible null pointer dereference in inventory_udim. #3498 (2.4.2.2)
    • oiiotool, maketx, iinfo, igrep, and iv now all take a --version command line argument, which just prints the OIIO version and exits. #3534

    Developer goodies / internals:

    • benchmark.h:
      • Alter the declaration of DoNotOptimize() so that it doesn't have compilation problems on some platforms. #3444 (2.4.2/2.3.17)
    • filesystem.h:
      • A new version of searchpath_split returns the vector of strings rather than needing to be passed a reference. #3154 (2.4.0/2.3.10)
      • New write_binary_file() utility function. #3199 (2.4.0/2.3.10)
      • searchpath_split() fixes to better handle empty paths. #3306 (2.4.0.1)
    • fmath.h:
      • Added round_down_to_multiple(). Also, more correctly handle round_to_multiple() results when the value is < 0. #3104
      • Add round_down_to_multiple() and improve round_to_multiple() to correctly handle cases where the value is less than 0. #3104 (2.4.0/2.3.8)
      • Make bit_cast specialization take refs, like the template. This fixes warnings for some compilers. #3213 (2.4.0/2.3.10.1)
    • imageio.h:
      • ImageInput and ImageOutput have many new helper methods (protected, meant for II and IO subclass implementations to use, not users of these classes) for helping to implement IOProxy support in format readers and writers. #3203 #3222 (2.4.0)
    • Imath.h:
      • In addition to including the right Imath headers for the version that OIIO is built with, this defines custom formatters for the Imath types for use with fmt::format/print or Strutil::format/print. #3367 (2.4.1.0)
    • oiioversion.h
      • OIIO_MAKE_VERSION_STRING and OIIO_VERSION_STRING now print all 4 version parts. #3368 (2.4.1.0)
    • parallel.h
      • Refactoring of the entry points (back compatible for API), and add support for using TBB for the thread pool (which seems slightly faster than our internal thread pool). By default it still uses the internal pool, but if OIIO::attribute("use_tbb") is set to nonzero, it will use the TBB thread pool if built against TBB. #3473 (2.4.2.2) #3566 (2.4.4.0)
    • paramlist.h
      • Various internal fixes that reduce the amount of ustring construction that happens when constructing ParamValue and ParamList, and making certain ImageSpec::attribute() calls. #3342 (2.4.1.0)
    • simd.h:
      • Better guards to make it safe to include from Cuda. #3291 #3292 (2.4.0.1/2.3.12)
      • Fix compiler warnings related to discrepancies between template declaration and redeclaration in simd.h. #3350 (2.4.1.0/2.3.14)
      • The vector types all now have a size() method giving its length. #3367 (2.4.1.0)
      • Defines custom formatters for the vector and matrix types, for use with fmt::format/print or Strutil::format/print. #3367 (2.4.1.0)
    • string_view.h
      • Auto-conversion between our string_view, std::string_view (when available), and fmt::string_view. #3337 (2.4.1.0)
      • OIIO::string_view is now fully templated, to match std::string_view. #3344 (2.4.1.0)
    • strutil.h:
      • New utility functions: parse_values(), scan_values(), scan_datetime() #3173 #3177 (2.4.0/2.3.10), edit_distance() #3229 (2.4.0/2.3.11)
      • The utf8_to_utf16() and ut16_to_utf8() utilities are now exposed on all platforms, not just windows (and their internals have been modernized). #3307 (2.4.0.1)
      • Strutil::isspace() is a safe alternative to C isspace(), that works even for signed characters. #3310 (2.4.1.0)
      • Strutil::print() now is buffered (and much more efficient, and directly wraps fmt::print). A new Strutil::sync::print() is a version that does a flush after every call. #3348 (2.4.1.0)
      • get_rest_arguments() fixes conflict between RESTful and Windows long path notations. #3372 (2.4.1.0/2.3.14)
      • Dramatically speed up (50-100x) Strutil iequals, iless, starts_with, istarts_with, ends_with, iends_with. #3388 (2.4.1.1)
      • New safe_strcat is a buffer-length-aware safe replcement for strcat. #3471 (2.4.0/2.3.18)
      • Strutil::debug() is the new OIIO::debug(), moving it from libOpenImageIO to libOpenImageIO_Util. #3486 (2.4.2.1)
      • New Strutil::safe_strlen() is a portable safe strlen replacement. #3501 (2.4.2.2)
    • sysutil.h:
      • The Term class now recognizes a wider set of terminal emulators as supporting color output. #3185 (2.4.0)
    • timer.h:
      • Timer::add_seconds() and Timer::add_ticks() allows add/subtract directly to a timer's elapsed value. #3070 (2.4.0/2.3.8)
      • For Linux, switch from using gettimeofday to clock_gettime, for potentially higher resolution. #3443 (2.4.2)
    • typedesc.h:
      • Add Cuda host/device decorations to TypeDesc methods to make them GPU friendly. #3188 (2.4.0/2.3.10)
      • TypeDesc constructor from a string now accepts "box2f" and "box3f" as synonyms for "box2" and "box3", respectively. #3183 (2.4.0/2.3.10)
    • type_traits.h:
      • This new header contains a variety of type traits used by other OIIO headers. They aren't really part of the public API, but they are sometimes used by public headers. #3367 (2.4.1.0)
    • unittest.h:
      • Changes OIIO_CHECK_SIMD_EQUAL_THRESH macro to compare <= eps instead of <. #3333 (2.4.0.3)
    • unordered_map_concurrent.h: Fix bug in erase() method. #3485 (2.4.2.2)
    • ustring.h:
      • New static method from_hash() creates a ustring from the known hash value. #3397 (2.4.2)
      • New ustringhash class is just like a ustring, except that the "local" representation is the hash, rather than the unique string pointer. #3436 (2.4.2)
    • vecparam.h:
      • New V3fParam, M33fParam, and M44fParam (defined in vecparam.h) are used just for parameter passing in public APIs, instead of Imath::V3f, M33f, or M44f, in order to more fully hide Imath types from our public interfaces. These are only parameter-passing classes, and are not useful as vector or matrix classes in their own right. But they seamlessly cast to and from other vector- and matrix-like classes. #3330 (2.4.1.0)
    • More internals conversion to use the new fmt style for string formatting, console output, error messages, and warnings: oiiotool internals #3240 (2.4.0); TS/IC stats output #3374 (2.4.1.0); misc #3777 (2.4.1.0); testshade #3415 (2.4.2)
    • Internals are working toward removing all uses of string_view::c_str(), since that isn't part of C++17 std::string_view. #3315 (2.4.0.1)
    • New testtex options: --minthreads sets the minimum numer of threads that will be used for thread wedges, --lowtrials is an optional maximum number of trials just for the 1 or 2 thread cse. #3418 (2.4.2)
    • Internals: internal classes with vertual methods now mark all their overridden destructors correctly as override. #3481 (2.4.2.1) #3488 #3511 (2.4.2.2)

    Build/test system improvements and platform ports:

    • CMake build system and scripts:
      • Remove the old FindOpenImageIO.cmake module; downstream clients should instead use our exported configs. #3098 (2.4.0/2.3.8)
      • Fix over-use of targets when we should have been using variables. #3108 (2.4.0/2.3.9)
      • CMake variable -DENABLE_INSTALL_testtex=1 causes testtex to be installed as an application. #3111 (2.4.0)
      • Make OpenImageIO_SUPPORTED_RELEASE into a CMake cache variable so it can be overridden at build time. #3142 (2.4.0)
      • New build option -DTIME_COMMANDS=ON will print time to compile each module (for investigating build performance; only useful when building with CMAKE_BUILD_PARALLEL_LEVEL=1). #3194 (2.4.0/2.3.10)
      • PROJECT_VERSION_RELEASE_TYPE is now a cache variable that can be overridden at build time. #3197 (2.4.0/2.3.10)
      • Set and use the variable PROJECT_IS_TOP_LEVEL to know if OIIO is a top level project or a subproject. #3197 (2.4.0/2.3.10)
      • Restore code that finds Jasper when using statically-linked libraw. #3210 (2.4.0/2.3.10.1)
      • Gracefully handle failing to find git for test data download. #3212 (2.4.0/2.3.10.1)
      • Make sure to properly use the tbb target if it exists. #3214 (2.4.0/2.3.10.1)
      • Use a project-specific "OpenImageIO_CI" for whether we're running in CI, rather than the confusingly generic "CI" #3211 (2.4.0/2.3.11)
      • If CMake variable BUILD_TESTING is OFF, don't do any automatic downloading of missing test data. #3227 (2.3.11/2.4.0)
      • Fixes to FindOpenColorIO.cmake module, now it prefers an OCIO exported cmake config (for OCIO 2.1+) unless OPENCOLORIO_NO_CONFIG=ON is set. #3278 (2.4.0.1/2.3.12)
      • Fix problems with FindOpenEXR build script for Windows. #3281 (2.4.0.1/2.3.12)
      • New CMake cache variable DOWNSTREAM_CXX_STANDARD specifies which C++ standard is the minimum for downstream projects (currently 14), which may be less than the CMAKE_CXX_STANDARD that specifies which C++ standard we are using to build OIIO itself. #3288 (2.4.0.1)
      • The exported cmake configs now use relative paths so they are relocatable. #3302 (2.4.0.1)
      • CMake variable OPENIMAGEIO_CONFIG_DO_NOT_FIND_IMATH, if set to ON, will make our generated config file not do a find_dependency(Imath). (Use with caution.) #3335 (2.4.0.3)
      • Can now do unity/jumbo builds. This isn't helpful when building with many cores/threads, but in thread-limited situtations (such as CI), it can speed up builds a lot to use -DCMAKE_UNITY_BUILD=ON. #3381 #3389 #3392 #3393 #3398 #3402 (2.4.2.0)
      • Do not auto-download test images by default. To auto download test images, build with -DOIIO_DOWNLOAD_MISSING_TESTDATA=ON. #3409 (2.4.0)
      • Allow using the Makefile wrapper on arm64 systems. #3456 (2.4.2)
      • The export OpenImageIOConfig.cmake fixes OpenImageIO_INCLUDE_DIR to work correctly on Debian systems where there are multiple filesystem components to the path. #3487 (2.4.2.1)
      • On MacOS, do not force MACOS_RPATH on. #3523 (2.4.2.2)
      • Improvements to the generated cmake config files when building static libraries. #3552 #3557 (2.4.4.0)
    • Dependency version support:
      • When using C++17, use std::gcd instead of boost. #3076 (2.4.0)
      • When using C++17, use inline constexpr instead of certain statics. #3119 (2.4.0)
      • Fixes to work with the libraw 202110 snapshot. #3143 (2.4.0/2.3.9.1)
      • Fix occasional build breaks related to OpenCV headers. #3135 (2.4.0/2.3.9)
      • The internals of Filesystem::searchpath_split have been reimplemented in such a way as to no longer need boost.tokenzer. #3154 (2.4.0/2.3.10)
      • Deal with the fact that OpenColorIO has changed its default branch name to "main". #3169 (2.4.0/2.3.10/2.2.20)
      • pybind11 v2.9.0 incorporated into our testing and CI. #3248
      • Fix clang10 compile warnings. #3272 (2.4.0.1/2.3.12)
      • Support for ffmpeg 5.0. #3282 (2.4.0.2/2.3.13)
      • Support for fmtlib 9.0.0. #3327 (2.4.0.2/2.3.13) #3466 (2.4.2/2.3.18)
      • build_opencolorio.bash helper script bumped its default build of OpenColorIO to 2.1.2. #3475 (2.4.2.1)
      • When building with C++17 or higher, Boost.filesystem is no longer needed or used. #3472 #3477 (2.4.2.1)
      • Upgrade the internal fallback implemention of PugiXML to the latest version. #3494 (2.4.2.2)
      • Fixes for ffmpeg 5.1 detection. #3516 (2.3.19.0/2.4.2.2)
      • Support for gcc 12.1. #3480 (2.4.2.1) #3551 (2.4.4.0)
      • Support building with clang 15.0. #3563 (2.4.4.0)
    • Testing and Continuous integration (CI) systems:
      • Properly test against all the versions of VFX Platform 2022. #3074 (2.4.0)
      • The helper script build_libtiff.bash now allows you to override the build type (by setting LIBTIFF_BUILD_TYPE) and also bumps the default libtiff that it downloads and builds from 4.1.0 to 4.3.0. #3161 (2.4.0)
      • New tests on MacOS 11 #3193 (2.4.0/2.3.10) and MacOS 12, remove test on MacOS 10.15 (GitHub Actions is imminently removing MacOS 10.15). #3528 (2.3.19.0/2.4.2.2)
      • Add a DDS test (we never had one before). #3200 (2.4.0/2.3.10)
      • imageinout_test now has options to make it easy to unit test just one named format, as well as to preserve the temp files for inspection. #3201 (2.4.0/2.3.10)
      • Add an HDR test (we never had one before). #3218 (2.4.0)
      • Fix bugs in the build_opencolorio.bash script, did not correctly handle installation into custom directories. #3278 (2.4.0.1/2.3.12)
      • Failed build artifact storage is revised to save more cmake-related artifacts to help debugging. #3311 (2.4.0.1)
      • Now doing CI builds for Intel icc and icx compilers. #3355 #3363 (2.4.1.0/2.3.13) #3407 (2.4.0)
      • Overhaul of ci.yml file to be more clear and compact by using GHA "strategy" feature. #3356 #3365 (2.4.1.0/2.3.13)
      • Removed CI for windows-2016 GHA instance which will soon be removed. #3370 (2.4.1.0)
      • Test against clang 14. #3404
      • Various guards against supply chain attacks durig CI. #3454 (2.4.2)
      • Test against pybind11 v2.10. #3478 (2.4.2.1)
      • Run SonarCloud nightly for static analysis and coverage analysis. #3505 (2.4.2.2)
    • Platform support:
      • Fix when building with Clang on big-endian architectures. #3133 (2.4.0/2.3.9)
      • Improvements to NetBSD and OpenBSD support. #3137. (2.4.0/2.3.9)
      • Fixes for MSVS compile. #3168 (2.4.0/2.3.10)
      • Fix problems on Windows with MSVC for Debug builds, where crashes were occurring inside isspace() calls. #3310
      • Improved simd.h support for armv7 and aarch32. #3361 (2.4.1.0/2.3.14)
      • Suppress MacOS wasnings about OpenGL deprecation. #3380 (2.4.1.0/2.3.14)
      • Fix MSVS/Windows errors. #3382 (2.4.1.1)
      • Fix cross-compiling on Android failing due to -latomic check. #3560 (2.4.4.0)
      • Fix building on iOS. #3562 (2.4.4.0)

    Notable documentation changes:

    • Add an oiiotool example of putting a border around an image. #3138 (2.4.0/2.3.9)
    • Fix explanation of ImageCache "failure_retries" attribute. #3147 (2.4.0/2.3.9)
    • Improved maketx argument explanations.
    • Clean up intra-document section references. #3238 (2.3.11/2.4.0)
    • New explanations about input and output configuration hints. #3238 (2.3.11/2.4.0)
    • More code examples in both C++ and Python (especially for the ImageInput, ImageOutput, and ImageBufAlgo chapters). #3238 #3244 #3250 (2.3.11/2.4.0) #3263 (2.3.12/2.4.0)
    • Pretty much anyplace where a parameter that represents a filename, and it is supporting UTF-8 encoding of Unicode filenames, the docs for that function explicitly say that the string is assumed to be UTF-8. #3312 (2.4.0.1)
    • Fix many typos in docs. #3492 (2.4.2.2)
    Source code(tar.gz)
    Source code(zip)
  • v2.3.20.0(Oct 1, 2022)

    Release 2.3.20 (1 Oct 2022) -- compared to 2.3.19

    • Fixes to compile with gcc 12. #3551
    • Fixes to compile with clang 15. #3563
    • PNG: better error handling when errors are encountered while writing. #3535

    The 2.3 family is now considered the OBSOLETE (semi-supported) branch. From here on out, additional patch releases to 2.3 will be small, increasingly infrequent, and focused on fixing truly critical bugs or keeping up with being able to build with new versions of compilers and dependencies. Over the coming months we will transition to eventually no longer updating 2.3 at all. At your earliest convenience, you are encouraged to upgrade to 2.4.

    Source code(tar.gz)
    Source code(zip)
  • v2.4.4.0-RC2(Sep 23, 2022)

    Changes since RC1:

    • ImageCache/TextureSystem both have added a getattributetype() method, which retrieves just the type of a named attribute. #3559 (2.4.4.0) NOTE: THIS IS AN ABI BREAKING CHANGE
    • Python: Fix the ability to getattribute() of int64 and uint64 metadata or attributes. #3555 (2.4.4.0)
    • Build: Improvements to the generated cmake config files when building static libraries. #3552 #3557 (2.4.4.0)
    • Support for gcc 12.1. #3480 (2.4.2.1) #3551 (2.4.4.0)
    • Support building with clang 15.0. #3563 (2.4.4.0)
    • Fix cross-compiling on Android failing due to -latomic check. #3560 (2.4.4.0)
    • Fix building on iOS. #3562 (2.4.4.0)
    Source code(tar.gz)
    Source code(zip)
  • v2.4.3.0-RC1(Sep 9, 2022)

    Release candidate for v2.4. We anticipate a full release on September 15. Please consult the CHANGES.md for a full list of improvements between the first 2.3 release and 2.4.

    Source code(tar.gz)
    Source code(zip)
  • v2.4.3.0-beta(Sep 1, 2022)

    This is the beta release of 2.4. We anticipate a full release on September 15. Please consult the CHANGES.md for a full list of improvements between the first 2.3 release and 2.4.

    Source code(tar.gz)
    Source code(zip)
  • v2.3.19.0(Sep 1, 2022)

    Release 2.3.19 (1 Sep 2022) -- compared to 2.3.18

    • idiff: --allowfailures allows the specified number of pixels to differ by any amount, and still consider the images to compare successfully. #3455
    • idiff: --failrelative and --warnrelative allows the failure and warning threshold to use a symmetric mean relative error (rather than the absolute error implied by the existing --fail and --warn arguments). #3508
    • A new flavor of ImageBufAlgo::compare() allows relative as well as absolute error thresholds. #3508
    • Build: Fixes for ffmpeg 5.1 detection. #3516
    • Build: suppress incorrect warnings for gcc 12. #3524
    • CI: New test on MacOS 12, remove test on MacOS 10.15 (GitHub Actions is imminently removing MacOS 10.15). #3528
    • oiiotool, maketx, iinfo, igrep, and iv now all take a --version command line argument, which just prints the OIIO version and exits. #3534
    • OIIO::getattribute("version") now retrieves the version string. #3534
    • Developer goodies: ArgParse::add_version(str) tells ArgParse the version string, which will automatically add an option --version. #3534
    Source code(tar.gz)
    Source code(zip)
  • v2.3.18.0(Aug 1, 2022)

    Release 2.3.18 (1 Aug 2022) -- compared to 2.3.17

    • Windows: Allow loading of dlls from PATH on Python 3.8+. #3470
    • JPEG: Fix a race condition in read_native_scanline. #3495
    • JPEG: Fix aspect ratio logic. #3500
    • Bug fix: incorrect assignment of oiio_missingcolor attribute. #3497
    • Bug fix: possible null pointer dereference in inventory_udim(). #3498
    • Bug fix: print_info_subimage botched condition. #3499
    • CI: Test against fmt 9.0.0. #3466
    • CI: Test against pybind11 v2.10. #3478
    • Strutil: safe_strcat() #3471 and safe_strlen() #3501
    • Change build_opencolorio.bash to default to OCIO 2.1.2. #3475
    Source code(tar.gz)
    Source code(zip)
  • v2.3.17.0(Jul 2, 2022)

    Release 2.3.17 (1 Jul 2022) -- compared to 2.3.16

    • TIFF: fix read problems with TIFF files with non-zero y offset. #3419
    • Targa: Fix reading of tiny 1x1 2-bpp Targa 1.0 images. #3433 (2.3.17/2.2.21) (2.3.17/2.2.21)
    • BMP: better detection of corrupted files with nonsensical image dimensions or total size. #3434 (2.3.17/2.2.21)
    • BMP: protect against corrupted files that have palette indices out of bound. #3435 (2.3.17/2.2.21)
    • TextureSystem: Fix typo that prevented "max_tile_channels" attribute from being set or retrieved. (2.3.17)
    • ustring.h: ustring has added a from_hash() static method #3397, and a ustringhash helper class #3436. (2.3.17/2.2.21)
    • benchmark.h: Alter the declaration of DoNotOptimize() so that it doesn't have compilation problems on some platforms. #3444 (2.3.17)
    • Fix crash when ioproxy is passed to an image writer that doesn't support it. #3453 (2.3.17)
    • Fix the "Makefile" wrapper to correctly recognize arm64 ("Apple silicon"). #3456 (2.3.17)
    Source code(tar.gz)
    Source code(zip)
  • v2.2.21.0(Jul 1, 2022)

    Note: This is a patch release of an obsolete release family. The currently family of releases enjoying full support is 2.3.

    Release 2.2.21 (1 Jul 2022) -- compared to 2.2.20

    • BMP: gain the ability to read some very old varieties of BMP files. #3375
    • BMP: better detection of corrupted files with nonsensical image dimensions or total size. #3434
    • BMP: protect against corrupted files that have palette indices out of bound. #3435
    • ffmpeg: Support for ffmpeg 5.0. #3282
    • ffmpeg: protect against possible double-free. #3376
    • ffmpeg: make the supported file extension check be case-insensitive. This prevents movie files from being incorrectly unable to recognize their format if they have the wrong capitalization of the file extension. #3364
    • hdr/rgbe files: Avoid possible Windows crash when dealing with characters with the high bit set. #3310
    • TIFF: fix read problems with TIFF files with non-zero y offset. #3419
    • Dev goodies: ustring has added a from_hash() static method #3397, and a ustringhash helper class #3436.
    • simd.h fixes for armv7 and aarch32. #3361
    Source code(tar.gz)
    Source code(zip)
  • v2.3.16.0(Jun 1, 2022)

    Release 2.3.16 (1 Jun 2022) -- compared to 2.3.15

    • UDIM texture lookups have been sped up by 5-8%. #3417
    • Support for Intel llvm-based compiler 2022.1.0. #3407
    • Internals: custom fmt formatters for vector types. #3367
    • Fix compiler breaks when using some changes in fmtlib master (not yet released). #3416
    Source code(tar.gz)
    Source code(zip)
  • v2.3.15.0(May 2, 2022)

    Release 2.3.15 (1 May 2022) -- compared to 2.3.14

    • JPEG: Better handling of PixelAspectRatio. #3366
    • OpenEXR: Fix DWAA compression default level. #3387
    • Perf: Huge speed-up of case-insensitive string comparisons (Strutil iequals, iless, starts_with, istarts_with, ends_with, iends_with), which also speeds up searches for attributes by name in ImageSpec and ParamValueList. #3388
    • New ImageBufAlgo::st_warp() (and oiiotool --st_warp) perform warping of an image where a second image gives the (s,t) coordinates to look up from at every pixel. #3379
    • Python: Add ImageSpec and ParamValueList method get_bytes_attribute(), which is like get_string_attribute(), but returns the string as a Python bytes object. In Python 3, strings are UTF-8, so this can be useful if you know that a string attribute might contain non-UTF8 data. #3396
    Source code(tar.gz)
    Source code(zip)
  • v2.3.14.0(Apr 1, 2022)

    Release 2.3.14 (1 Apr 2022) -- compared to 2.3.13

    • Add support for UDIM pattern <uvtile> (used by Clarisse & V-Ray). #3358
    • BMP: Support for additional (not exactly fully documented) varieties used by some Adobe apps. #3375
    • Python: support uint8 array attributes in and out. This enables the proper Python access to "ICCProfile" metadata. #3378
    • Improved precision in IBA::computePixelStats(). #3353
    • ffmpeg reader not uses case-insensitive tests on file extensions. #3364
    • Fix writing deep exrs when buffer datatype doesn't match the file. #3369
    • Fix conflict between RESTful and Windows long path notations. #3372
    • ffmpeg reader: take care against possible double-free of allocated memory crash upon destruction. #3376
    • simd.h fixes for armv7 and aarch32. #3361
    • Fix compiler warnings related to discrepancies between template declaration and redeclaration in simd.h and benchmark.h. #3350
    • Suppress MacOS warnings about OpenGL depreation. #3380
    • Now doing CI builds for Intel icc and icx compilers. #3355 #3363
    • CI: Overhaul of yml file to be more clear and compact by using GHA "strategy" feature. #3356 #3365
    Source code(tar.gz)
    Source code(zip)
  • v2.3.13.0(Mar 1, 2022)

    Release 2.3.13 (1 Mar 2022) -- compared to 2.3.12

    • Filesystem::searchpath_split better handling of empty paths. #3306
    • New Strutil::isspace() is an isspace replacement that is safe for char values that are < 0. #3310
    • Expose the Strutil::utf8_to_utf16() and utf16_to_utf8() utilities on non-Windows platforms (and also modernize their internals). #3307
    • For the most important ImageInput, ImageOutput, and ImageBuf methods that take a filename, add new flavors that can accept a wstring as the filename. #3312 #3318
    • PPM: properly report color space as Rec709 (as dictated by PPM spec). #3321
    • PNG: more robust reporting of color space as sRGB in the absence of header fields contradicting this. #3321
    • strutil.h: Split the including of fmt.h and some related logic into a separate detail/fmt.h. This is still included by strutil.h, so users should not notice any change. #3327
    • Targa: Fix parsing of TGA 2.0 extension area. #3323
    • Support building against FFmpeg 5.0. #3282
    • oiiotool --pixelaspect : fix setting of "PixelAspectRatio", "XResolution", and "YResolution" attributes in the output file (were not set properly before). #3340
    Source code(tar.gz)
    Source code(zip)
  • v2.3.12.0(Feb 1, 2022)

    Release 2.3.12 (1 Feb 2022) -- compared to 2.3.11

    • oiiotool: Don't give spurious warnings about no output when the --colorcount or --rangecheck commands are used. #3262
    • oiiotool --pattern checker fixed behavior so that if only the checker width was specified but not the height, height will be equal to width. #3255
    • oiiotool --point lets you set individual pixels. #3256
    • Python: A new ImageBuf constructor was added that takes only a NumPy ndarray, and deduces the resolution, channels, and format (pixel data type) from the shape of the array. #3246
    • Python: Implement ROI.copy(). #3253
    • Python: ImageSpec and ParamValueList now support 'key' in spec, del spec['key'], and spec.get('key', defaultval) to more fully emulate Python dict syntax for manipulating metadata. #3252 (2.3.12/2.4.0)
    • Python bug fix: fix clamp() when the min or max are just a float. Now it uses that one value for all channels, instead of using it only for the first channel. #3265
    • ImageSpec gained an additional constructor that takes a string representation of the pixel data type (where it used to insist on a TypeDesc), such as ImageSpec(640, 480, 3, "uint8"). This is especially helpful for new/casual users, or when you want code to be maximally readable. #3245
    • Imagepec::getattribute() new query token "format" can retrieve the pixel data type. #3247
    • IBA::make_texture(): ensure that "maketx:ignore_unassoc" is honored. #3269
    • Support an additional UDIM pattern <UVTILE>, which is specified by MaterialX. #3280
    • TIFF: support 16-bit palette images. #3260
    • TIFF: Gracefully handle missing ExtraSamples tag. #3287
    • Targa: Better interpretation of TGA 1.0 files with alpha that is zero everywhere. Be more consistent with Targa attributes all being called "targa:foo". Add "targa:version" to reveal whether the file was TGA 1.0 or 2.0 version of the format. #3279
    • simd.h: Better guards to make it safe to include from Cuda. #3291 #3292
    • Fix bugs in the build_opencolorio.bash script, did not correctly handle installation into custom directories. #3278
    • Fixes to FindOpenColorIO.cmake module, now it prefers an OCIO exported cmake config (for OCIO 2.1+) unless OPENCOLORIO_NO_CONFIG=ON is set. #3278
    • Docs: The ImageBufAlgo chapter now has examples for C++, Python, and oiiotool for almost every operation. #3263
    Source code(tar.gz)
    Source code(zip)
  • v2.2.20.0(Feb 1, 2022)

    Release 2.2.20 (1 Feb 2022) -- compared to 2.2.19

    • Fix some address sanitizer failures. #3160
    • Build/CI: Deal with OpenColor renaming its master branch to main. #3169
    • Windows: Fix error when compiling with MSVC. #3168
    • Fix excessive memory usage when saving EXR with many channels. #3176
    • TIFF: now works for 16-bit palette images. #3260
    • Fix ImageBuf::read bug for images of mixed per-channel data types. #3088
    Source code(tar.gz)
    Source code(zip)
  • v2.3.11.0(Jan 1, 2022)

    Release 2.3.11 (1 Jan 2022) -- compared to 2.3.10

    • JPEG2000: enable multithreading for decoding (if using OpenJPEG >= 2.2) and encoding (if using OpenJPEG >= 2.4). This speeds up JPEG-2000 I/O by 3-4x. #2225
    • TIFF: automatically switch to "bigtiff" format for >4GB images. #3158
    • Security: New global OIIO attributes "limits:channels" (default: 1024) and "limits:imagesize_MB" (default: 32768, or 32 GB) are intended to reject input files that exceed these limits, on the assumption that they are either corrupt or maliciously constructed, and would, if read, lead to absurd allocations, crashes, or other mayhem. Apps may lower or raise these limits if they know that a legitimate input image exceeds these limits. Currently, only the TIFF reader checks these limits, but others will be modified to honor the limits over time. #3230
    • TextureSystem: enhance safety/correctness for untiled images that exceed 2GB size (there was an integer overflow problem in computing offsets within tiles). #3232
    • Cleanup: Get rid of an obsolete header c-imageio.h that was experimental and the functions declared therein were not implemented in this release. #3237
    • Build: rely on env variable "OpenImageIO_CI" to tell us if we are running in a CI environment, not the more generic "CI" which could be set for other reasons in some environments. #3211
    • Build: Improvements in how we find OpenVDB. #3216
    • Build: If CMake variable BUILD_TESTING is OFF, don't do any automatic downloading of missing test data. #3227
    • Dev: Add Strutil::edit_distance(). #3229
    • Docs: Clean up intra-document section references, new explanations about input and output configuration hints, more code examples in both C++ and Python (especially for the ImageInput and ImageOutput chapters). #3238 #3244
    Source code(tar.gz)
    Source code(zip)
  • v2.3.10.1(Dec 8, 2021)

    Release 2.3.10.1 (7 Dec 2021) -- compared to 2.3.10.0

    • Build: restore code that finds Jasper when using statically-linked libraw. #3210
    • Build/test: Gracefully handle failing to find git for test data download. #3212
    • fmath.h: bit_cast specialization should take refs, like the template. This made warnings for some compilrs. #3213
    • Build: make sure to properly use the tbb target if it exists. #3214
    Source code(tar.gz)
    Source code(zip)
  • v2.3.10.0(Dec 1, 2021)

    Release 2.3.10 (1 Dec 2021) -- compared to 2.3.9

    New (non-compatibility-breaking) features:

    • TextureSystem: add feature for stochastic mipmap interpolation. This adds new interpolation modes "StochasticTrilinear" and "StochasticAniso", which in conjunction with the "rnd" field in TextureOpt, will stochastically choose between bracketing MIPmap levels rather than interpolating them. This reduces texture lookup cost by up to 40%, but it's only useful in the context of a renderer that uses many samples per pixel. #3127
    • maketx/make_texture() now supports options to store Gaussian forward and inverse transform lookup tables in image metadata (must be OpenEXR textures for this to work) to aid writing shaders that use histogram-preserving blending of texture tiling. This is controlled by new maketx arguments --cdf, --cdfsigma, --sdfbits, or for IBA::make_texture() by using hints maketx:cdf, maketx:cdfsigma, and maketx:cdfbits. #3159
    • oiitool --oiioattrib can set "global" OIIO control attributes for an oiiotool run (equivalent of calling OIIO::attribute()). #3171
    • oiiotool --repremult exposes the previously existing IBA::repremult(). The guidance here is that --premult should be used for one-time conversion of "unassociated alpha/unpremultiplied color" to associated/premultiplied, but when you are starting with a premultiplied image and have a sequence of unpremultiply, doing some adjustment in unpremultiplied space, then re-premultiplying, it's --repremult you want as the last step, because it preserves alpha = 0, color > 0 data without crushing it to black. #3192
    • oiiotool --saturate and IBA::saturate() can adjust saturation level of a color image. #3190
    • When building against OpenEXR >= 3.1.3, our OpenEXR output now supports specifying the zip compression level (for example, by passing the "compression" metadata as "zip:4"). Also note than when using OpenEXR >= 3.1.3, the default zip compression has been changed from 6 to 4, which writes compressed files significantly (tens of percent) faster, but only increases compressed file size by 1-2%. #3157
    • Improved image dithering facilities: When dithering is chosen, it now happens any time you reduce >8 bits to <= 8 bits (not just when converting from float or half); change the dither pattern from hashed to blue noise, which looks MUCH better (beware slightly changed appearance); IBA::noise() and oiiotool --noise now take "blue" as a noise name, giving a blue noise pattern; IBA::bluenoise_image() returns a reference to a stored periodic blue noise iamge; oiiotool -d now lets you ask for "uint6", "uint4", "uint2", and "uint1" bit depths, for formats that support them. #3141
    • New global OIIO attribute "try_all_readers" can be set to 0 if you want to override the default behavior and specifically NOT try any format readers that don't match the file extension of an input image (usually, it will try that one first, but it if fails to open the file, all known file readers will be tried in case the file is just misnamed, but sometimes you don't want it to do that). #3172
    • Raise the default ImageCache default tile cache from 256MB to 1GB. This should improve performance for some operations involving large images or images with many channels. #3180
    • IOProxy support has been added to JPEG output (already was supported for JPEG input) and for GIF input and output. #3181 #3182
    • oiiotool --maxchan and --minchan, and IBA::maxchan() and minchan() turn an N-channel image into a 1-channel images that for each pixel, contains the maximum value in any channel of the original for that pixel. #3198

    Bug fixes:

    • Fix oiiotool --invert to avoid losing the alpha channel values. #3191
    • Fix excessive memory usage when saving EXR files with many channels. #3176
    • WebP: Fix previous failure to properly set the "oiio:LoopCount" metadata for animated webp images. #3183
    • Targa: Better detection/safety when reading corrupted files, and fixed bug when reading x-flipped images. #3162
    • RLA: better guards against malformed input. #3163
    • Fix oiiotool bug when autocropping output images when the entire pixel data window is in the negative coordinate region. #3164
    • oiiotool improved detection of file reading failures. #3165
    • DDS: Don't set "texturetype" metadata, it should always have been only "textureformat". Also, add unit testing of DDS to the testsuite. #3200
    • When textures are created with the "monochrome-detect" feature enabled, which turns RGB textures where all channels are always equal into true single channel greyscale, the single channel that results is now correctly named "Y" instead of leaving it as "R" (it's not red, it's luminance). #3205

    Build fixes and developer goodies:

    • Update internal stb_printf implementation (avoids some sanitizer alerts). #3160
    • Fixes for MSVS compile. #3168
    • Add Cuda host/device decorations to TypeDesc methods to make them GPU friendly. #3188
    • TypeDesc: The constructor from a string now accepts "box2f" and "box3f" as synonyms for "box2" and "box3", respectively. #3183
    • New Strutil::parse_values, scan_values, scan_datetime, parse_line. #3173 #3177
    • New Filesystem::write_binary_file() utility function. #3199
    • New build option -DTIME_COMMANDS=ON will print time to compile each module (for investigating build performance; only useful when building with CMAKE_BUILD_PARALLEL_LEVEL=1). #3194
    Source code(tar.gz)
    Source code(zip)
  • v2.3.9.1(Nov 1, 2021)

    Release 2.3.9.1 (1 Nov 2021) -- compared to 2.3.8

    • OpenEXR: When building against OpenEXR 3.1+ and when the global OIIO attribute "openexr:core" is set to nonzero, do more efficient multithreaded reading of OpenEXR files. #3107
    • oiiotool --dumpdata:C=name causes the dumped image data to be formatted with the syntax of a C array. #3136
    • oiiotool: Allow quotes in command modifiers. #3112
    • jpeg input: remove stray debugging output to console. #3134
    • HEIF: Handle images with unassociated alpha. #3146
    • Targa: improved error detection for read errors and corrupted files. #3120
    • raw: When using libraw 0.21+, now support new color space names "DCE-P3", "Rec2020", and "sRGB-linear", and "ProPhoto-linear". Fix incorrect gamma values for "ProPhoto". #3123 #3153 Fixes to work with the libraw 202110 snapshot. #3143
    • TIFF: honor zip compression quality request when writing TIFF. #3110
    • Fix broken oiiotool --dumpdata output. #3131
    • Fix possible bad data alignment and SIMD assumptions inside TextureSystems internals. #3145
    • Field3D, which is no longer actively supported, now has support disabled in the default build. To enable Field3D support, you must build with -DENABLE_FIELD3D=1. Note that we expect it to be no longer supported at all, beginning with OIIO 2.4. #3140
    • Build: Address new warnings revealed by clang 13. #3122
    • Build: Fix when building with Clang on big-endian architectures. #3133
    • Build: Fix occasional build breaks related to OpenCV headers. #3135
    • Build: Improvements to NetBSD and OpenBSD support. #3137.
    • docs: Add an oiiotool example of putting a border around an image. #3138
    • docs: Fix explanation of ImageCache "falure_retries" attribute. #3147
    Source code(tar.gz)
    Source code(zip)
  • v2.2.19.0(Nov 1, 2021)

    Release 2.2.19 (1 Nov 2021) -- compared to 2.2.18

    • Better catching of exceptions thrown by OCIO 1.x if it encounters 2.0 config files. #3089
    • Address new warnings revealed by clang 13. #3122
    • Fixed some minor python binding bugs. #3074 #3094
    • Fix when building with Clang on big-endian architectures. #3133
    • Fix occasional build breaks related to OpenCV headers. #3135
    • Improvements to NetBSD and OpenBSD support. #3137.
    • Fixes to work with the libraw 202110 snapshot. #3143

    Note: This is an update to the obsolete 2.2 release family. The current fully-supported release family is 2.3.

    Source code(tar.gz)
    Source code(zip)
  • v2.3.8.0(Oct 2, 2021)

    Release 2.3.8 (1 Oct 2021) -- compared to 2.3.7

    • Fix ImageBuf::read() bug for images of mixed per-channel data types. #3088
    • Fix crash that could happen with invalidly numbered UDIM files. #3116
    • Better catching of exceptions and other error handling when OpenColorIO 1.x is used but encounters an OpenColorIO 2.x config file. #3089 #3092 #3095
    • Ensure that OpenColorIO doesn't send info messages to the console if no config is found. #3113
    • Fix: make sure ImageSpec deserialization works for arbitrary attribs. #3066
    • oiiotool -ch now has greatly reduced cost (no useless allocations or copies) when the channel order and names don't change. #3068
    • oiiotool --runstats is now much better about correctly attributing I/O time to -i instead of to the subsequent operations that triggers the read. #3073
    • TIFF output now supports IO proxies. #3075 #3077
    • Improved finding of fonts (by IBA::render_text and oiiotool --text). It now honors environment variable $OPENIMAGEIO_FONTS and global OIIO attribute "font_searchpath" to list directories to be searched when fonts are needed. #3096
    • We no longer install a FindOpenImageIO.cmake module. It was incomplete, out of date, and wholly unnecessary now that we correctly export a config file OpenImageIOConfig.cmake and friends. #3098
    • When building against OpenEXR 3.1+, use of the OpenEXRCore library no longer requires a build-time option, but instead is always available (though off by default) and can be enabled by an application setting the OIIO global attribute "openexr:core" to 1. #3100
    • dev: Timer::add_seconds and add_ticks methods. #3070
    • dev: Add round_down_to_multiple() and improve round_to_multiple() to correctly handle cases where the value is less than 0. #3104
    Source code(tar.gz)
    Source code(zip)
  • v2.3.7.2(Sep 1, 2021)

    Release 2.3 (1 Sept 2021) -- compared to 2.2

    New minimum dependencies and compatibility changes:

    • C++ standard: C++14 is now the minimum (gcc 6.1 - 11.2, clang 3.4 - 12, MSVS 2017 - 2019, icc 17+). The default C++ standard mode, if none is explicitly specified, is now C++14. #2918 (2.3.4) #2955 #2977 (2.3.5)
    • FFMmpeg (optional) dependency minimum is now 3.0 (raised from 2.6). #2994
    • OpenCV (optional) dependency minimum is now 3.0 (raised from 2.0). #3015

    New major features and public API changes:

    • Changes and clarifications to geterror() in all classes that have one:
      • geterror() now takes an optional clear parameter controls if the pending error is cleared as well as retrieved (default true).
      • All classes with geterror() are ensured to have has_error().
      • geterror() appends to the pending error message, if one is already present but not retrieved. Appending errors will be automatically separated by newlines, also any newline at the end of a geterror call will be stripped. #2740 (2.3.0.1)
    • ImageInput error messages are now thread-specific. This prevents multiple threads simultaneously reading from the same ImageInput from getting the other thread's error messages. But it means you must always retrieve an error with getmessage() from the same thread that made the read call that generated the error. #2752 (2.3.0.1)
    • ImageInput and ImageOutput have removed several fields (like the m_mutex) and instead now use a PIMPL idiom that hides internals better from the ABI. If you had a custom ImageInput/Output class that directly accessed the m_mutex, replace it instead with calls to ImageInput::lock() and unlock() (and ImageOutput). #2752 (2.3.1.0)
    • Clarify that ImageBuf methods subimage(), nsubimages(), miplevel(), nmipevels(), and file_format_name() refer to the file that an ImageBuf was read from, and are thus only meaningful for ImageBuf's that directly read from files. "Computed" or copied ImageBuf's are solo images in memory that no longer correspond to a file even if the input to the computation was from a file. #2759 (2.3.0.1/2.2.9)
    • New get_extension_map() returns a map that list all image file formats and their presumed file extensions. #2904 (2.3.4)
    • Overhaul of how we handle "thumbnails" (small preview images embedded in the headers of some image file formats) #3021 (2.3.7):
      • Thumbnails no longer embedded in the ImageSpec as "thumbnail_image" metadata of a big character array blob.
      • ImageInput, ImageBuf, and ImageCache have varieties of get_thumbnail() method that returns the thumbnail as an ImageBuf. If this is not called, ideally the reader will not undergo the expense of reading and storing thumbnail data.
      • ImageOutput and ImageBuf have set_thumbnail() to communicate a thumbnail image as an ImageBuf.
      • The net effect is that reading files and retrieving ImageSpec's should be more efficient for apps that don't have a use for thumbnails.
    • Significant improvements to UDIM handling in ImageCache/TextureSystem:
      • New UDIM texture name patterns recognized: %(UDIM)d is the Houdini convention, and _u##v## is for Animal Logic's internal renderer. #3006 (2.2.16/2.3.6)
      • It is now permissible for get_texture_info()/get_image_info() to retrieve metadata for UDIM patterns -- previously it failed, but now it will succeed in retrieving any metadata as long as it is present and has the same value in all the matching "UDIM tile" panels. #3049 (2.3.7)
      • TextureSystem now exposes methods is_udim(), resolve_udim(), inventory_udim() that should be helpful for apps dealing with UDIM textures. See the documentation for details. #3054 (2.3.7)
      • Performance improvements when using UDIM textures. #3049 (2.3.7)
    • ImageBuf, when "wrapping" an app-owned buffer, now allows explicit specification of stride lengths. This allows you to wrap a buffer that has internal padding or other non-contiguous spacing of pixels, scanlines, or image planes. #3022 (2.3.6)
    • oiiotool new commands and options:
      • --pastemeta takes two images as arguments, and appends all the metadata (only) from the first image onto the second image's pixels and metadata, producing a combined image. #2708 (2.3.0.0)
      • --chappend and --siappend both allow an optional modifier :n= to specify the number of images from the stack to be combined (default n=2). #2709 (2.3.0.0)
      • --fit now takes an additional optional modifier: fillmode= with choices of letterbox (default), width, and height. #2784 (2.3.2.0)
      • --autocc now has an optional modifier :unpremult=1 that causes any color transformations related to autocc to unpremultiply by alpha before the transformation and then re-premultiply afterwards, exactly the same control that exists for individual --colorconvert but never existed for autocc. #2890 (2.3.3)
      • --list-formats lists all the image file formats that OIIO knows about, and for each, the associated file extensions. #2904 (2.3.4)
      • --skip-bad-frames causes an error (such as an input file not being found) to simply skip to the next frame in the frame range loop, rather that immediately exiting. #2905 (2.3.4)
      • When doing expression substitution, {getattribute(name)} will be replaced by the value that OIIO::getattribute(name, ...) would retrieve. #2932 (2.3.4)
      • --missingfile (which takes a subsequent argument of error, black, or checker) determines the behavior when an input image file is missing (the file does not exist at all, does not include cases where the file exists but there are read errors). The default value of error matches the old behavior: report an error and terminate all command processing. Other choices of black or checker will continue processing but substitute either a black or checkerboard image for the missing file. #2949 (2.3.4)
      • --printinfo prints verbose metadata info about the current top image on the stack. #3056 (2.3.7)
      • --printstats prints statistics about the current top image on the stack, and optionally can limit the statistics to a rectangular subregion of the image. #3056 (2.3.7)
      • Expanded expression now support the following new metadata notations: META, METABRIEF, and STATS. #3025 (2.3.6)
      • --mosaic now takes optional fit=WxH modifier that lets you set the "cell" size, with all constituent images resized as needed (similarly to if you used --fit on each individually). This is helpful for creating contact sheets without having to resize separately or to know the resolution of the original images. #3026 (2.3.6)
      • REMOVED --histogram which had been deprecated and undocumented since before OIIO 2.0. #3029 (2.3.6)
    • Python bindings:
      • When transferring blocks of pixels (e.g., ImageInput.read_image() or ImageOutput.write_scanline()), "half" pixels ended up mangled into uint16, but now they use the correct numpy.float16 type. #2694 (2.3.0.0)
      • The value passed to attribute(name, typedesc, value) can now be a tuple, list, numpy array, or scalar value. #2695 (2.3.0.0)
      • Added Python bindings for the TextureSystem. #2842
      • Add the previously (inadvertently) omitted enum value for ImageBufAlgo.MakeTxBumpWithSlopes. #2951 (2.3.4)
    • Environment variables:
      • CUE_THREADS env variable, if set, is now honored to set the default size of the OIIO thread pool. This helps to make OIIO-based apps be good citizens when run as OpenCue jobs. #3038 (2.3.7)
    • Library organization:
      • All the utility classes are now in libOpenImageIO_Util only and libOpenImageIO depends on and links to libOpenImageIO_Util, rather than the utility classes being defined separately in both libraries. #2906 (2.3.4)
      • Include file change: imagebuf.h no longer includes imagecache.h. It should never have needed to, since it didn't need any of its declarations. Other code that should always have included both headers, but inadvertently only included imagebuf.h, may now need to add an explicit #include <OpenImageIO/imagecache.h>. #3036 (2.3.7)
    • Important change to Makefile wrapper: We have a 'Makefile' that just wraps cmake for ease of use. This has changed its practice of putting builds in build/ARCH to just build (and local installs from dist/ARCH to dist) to better match common cmake practice. So where your local builds end up may shift a bit. #3057 (2.3.7)
    • Deprecations: A number of long-deprecated functions and methods have been given deprecation attributes that will cause warnings if you use them. They will eventually be removed entirely at the next "breaking" release (3.0, whenever that is). #3032 (2.3.7)

    Performance improvements:

    • Speed up BMP reading by eliminating wasteful allocation and copying done on each scanline read. #2934 (2.3.4)
    • For IBA::to_OpenCV(), improve efficiency for certain image copies. #2944 (2.3.4)
    • Fix runaway parsing time for pathological XMP metadata. #2968 (2.3.5/2.2.15)
    • TextureSystem reduction in overhead when using UDIM textures. #3049 (2.3.7)

    Fixes and feature enhancements:

    • Fix a situation where if an ImageBuf backed by an ImageCache reads an image, then the image changes on disk, then another ImageBuf or ImageCache tries to read it, it could end up with the old version. This involved some strategic cache invalidation when ImageBuf's write images to disk. #2696 (2.3.0.0)
    • Improve parsing of XMP records in metadata: more correct handling of lists/sequences, better inference of types that look like int or float (rather than forcing unknown fields into strings), fixed bugs in parsing rational values. #2865 (2.2.12/2.3.3)
    • ImageBuf/ImageBufAlgo:
      • IBA::contrast_remap() fixes bug that could crash for very large images #2704 (2.3.0.0)
      • Fix stack overflow crash in IBA::colorconvert of unusually wide images. #2716 (2.3.0.1/2.2.8)
      • Fix IBA::make_texture() incorrectly setting tile sizes. #2737 (2.3.0.1/2.2.8)
      • IBA::make_texture() now correctly propagates error messages, which can be retrieved via the global OIIO::geterror() call. #2747 (2.3.0.1)
      • IBA::fit() now takes a fillmode parameter that controls exactly how the resize will occur in cases where the aspect ratio of the new frame doesn't exactly match that of the source image. The old way (and the default value now) is "letterbox", but now also "width" and "height" modes are allowed. See fit() documentation for details. #2784 (2.3.2.0)
      • IBA::fit() fixes some slight ringing at image edges when using a combination of black wrap mode and a filter with negative lobes. #2787 (2.3.2.0)
      • Fix: ociolook() and ociofiletransform() internally reversed the order of their inverse and unpremult arguments, making it hard to select the inverse transformation. #2844 (2.3.3/2.2.11)
      • Fix crash for certain calls to ImageBuf::set_write_format() when writing files that support per-channel data types. #2885 (2.3.3)
      • Fix: IBA::fillholes_pushpull did not correctly understand which channel was alpha when generating subimages. #2939 (2.3.4)
      • Fix: IBA::render_text did not properly account for non-1 alpha of the text color. #2981 (2.3.5/2.2.15)
      • IBA::colorconvert, colormatrixtransform, ociolook, ociodisplay, and ociofiletransform have been fixed so that if input is more than 4 channels, the additional channels will be copied unchanged, rather than inadvertently set to 0. #2987 (2.3.5/2.2.16)
      • Thread safety has been improved for ImageBuf::init_spec() and read() (though no problem was ever reported in the wild). #3018 (2.3.6)
      • render_text() now accepts text strings with embedded linefeeds and will turn them into multiple lines of rendered text. #3024 (2.3.6)
    • ImageCache/TextureSystem/maketx:
      • Fix ImageCache bug: add_tile/get_tile not properly honoring when chend < chbegin it should get all channels. #2742 (2.3.0.1/2.2.8)
      • ImageBufAlgo::make_texture() (as well as maketx and oiiotool -otex) clamp half values to their maximum finite range to prevent very large float inputs turning into Inf when saved as half values. #2891 (2.3.3)
      • Fix crash when sampling non-zero-base channels. #2962 (2.3.5/2.2.15)
      • IBA::make_texture() rejects "deep" input images, since they cannot be made into textures. Doing this could previously crash. #2991 (2.3.5/2.2.16)
      • maketx and oiiotool -otex have fixed double printing of error messages #2992 (2.3.5).
      • Making bumpslopes textures now allows scaled slopes UV normalization. This is exposed as new maketx argument --uvsopes_scale, or passing the attribute uvslopes_scale (int) to make_texture(). #3012 (2.3.6)
      • There is a new variety of ImageCache::invalidate() that takes an ImageHandle* argument instead of a filename. #3035 (2.3.7)
    • oiiotool:
      • --resize of images with multi-subimages could crash. #2711 (2.3.0.0)
      • Improve oiiotool's guessing about the desired output format based on inputs (in the absence of -d to specify the format). #2717 (2.3.0.1/2.2.8)
      • --text now accepts text strings with embedded linefeeds and will turn them into multiple lines of rendered text. #3024 (2.3.6)
    • BMP
      • Fix reading BMP images with bottom-to-top row order. #2776 (2.3.1.1/2.2.9)
      • Correctly read BMP images of the older V1 variety without crashing. #2899 (2.3.3/2.2.13)
      • Fix error in the rightmost pixel column when reading 4 bpp images with odd horizontal resolution. #2899 (2.3.3/2.2.13)
      • BMP reads now return metadata "bmp:bitsperpixel" (only when not 24 or 32) to indicate non-whole-byte channels sizes in the file, and "bmp:version" to indicate the version of the BMP format. #2899 (2.3.3/2.2.13)
      • Speed up BMP reading by eliminating wasteful allocation and copying done on each scanline read. #2934 (2.3.4)
      • For BMP files that are 8 bits per pixel and all palette entries have R == G == B values, read the file as an 8-bit grayscale image instead of needlessly promoting to a full RGB 3-channel image. #2943 (2.3.4)
      • Full support for reading RLE-compressed BMP images. #2976 (2.3.5/2.2.15)
      • Write single channel BMP as 8 bit palette images. #2976 (2.3.5/2.2.15)
    • DPX
      • Output to DPX files now supports IOProxy. (Input already did.) #3013 (2.2.17/2.3.6)
    • FFMpeg/movies:
      • Avoid potential crash when a frame can't be read. #2693 (2.3.0.0)
      • Several varieties of encoded videos with 12 bits per channel and having alpha were incorrectly reported as 8 bits and without alpha. #2989 (2.3.5/2.2.16)
    • GIF
      • Support UTF-8 filenames on Windows for GIF files. #2777 (2.3.2.0)
      • Fix error checking for non-existant GIF files. #2886 (2.3.3)
    • HEIC
      • Fix error decoding Apple HEIF files. #2794/#2809 (2.3.2.0)
      • Better valid_file() check for HEIF. #2810 (2.3.2.0)
      • Enabled AVIF decoding of heic files (requires libheif >= 1.7 and for it to have been built with an AV1 encoder/decoder). #2811 #2812 #2814 #2818 (2.3.3.0)
    • IFF
      • Fix broken reads of 16 bit iff files. #2736 (2.3.0.1/2.2.8)
    • JPEG
      • Allow reading of JPEG files with mildly corrupted headers. #2927 (2.3.4)
    • OpenEXR:
      • Fix rare crash that was possible when multithreaded writing openexr files. #2781 (2.3.2.0)
      • Improved error reporting when errors are encountered writing OpenEXR files. #2783 (2.3.2.0)
      • Fix potential crash parsing OpenEXR header that contains Rational attributes with certain values. #2791 (2.2.10/2.3.2)
      • EXPERIMENTAL: When building against OpenEXR 3.1, the OIIO CMake option -DOIIO_USE_EXR_C_API=ON will use a new OpenEXR API that we think will allow higher performance texture reads in a multithreaded app. This has not yet been benchmarked or tested thoroughly. #3009 #3027 (2.3.6)
      • The reader no longer renames file metadata "version" into the special "openexr:version" that would indicate the OpenEXR file format version of the file. That's never what it meant! It really was just arbitrary metadata. #3044 (2.3.7)
    • PNG
      • Read Exif data from PNG files. #2767 (2.3.1.1/2.2.9)
    • PSD
      • Add support for reading ISD profiles for PSD input. #2788 (2.3.2.0)
      • Fix loading PSB files with cinf tags. #2877 (2.2.12/2.3.2)
    • RAW:
      • Additional input configuration hints to control options in the underlying LibRaw: "raw:user_flip" #2769 (2.3.1.0) "raw:balance_clamped", "raw:apply_scene_linear_scale", "raw:camera_to_scene_linear_scale" #3045 (2.3.7)
      • Correctly handle RAW files with Unicode filenames on Windows. #2888 (2.3.3)
      • Fix garbled output when raw:Demosaic hint is "none". #3045 (2.3.7)
    • Targa
      • Fix potential crash when reading files with no thumbnail. #2903 (2.3.3/2.2.13)
      • Fix alpha handling for some files. #3019 (2.3.6)
    • TIFF:
      • Fix broken reads of multi-subimage non-spectral files (such as photometric YCbCr mode). #2692 (2.3.0.0)
      • Fix spec() and spec_dimensions() for MIPmapped TIFF files, they did not recognize being asked to return the specs for invalid subimage indices. #2723 (2.3.0.1/2.2.7)
      • Add ability to output 1bpp TIFF files. #2722 (2.3.0.1/2.2.7)
      • Fix reading TIFF files with "separate" planarconfig and rowsperstrip more than 1. #2757 (2.3.0.1/2.2.9)
      • Fix incorrect reading of tiled TIFF files using certain rare TIFF features that also have a vertical resolution that is not a whole multiple of the tile size. #2895 (2.3.3/2.2.13)
      • Support IOProxy for reading TIFF files. #2921 (2.3.4)
      • TIFF plugin now properly honors caller request for single-threaded operation. #3016 (2.3.6)
    • WebP:
      • Add support for requesting compression "lossless". #2726 (2.3.0.1/2.2.8)
      • Input improvements including: RGB images are kept as RGB instead of always adding alpha; more efficient by skipping alpha premultiplication when it's unnecessary; now can read animated WebP images as multi-subimage files. #2730 (2.3.0.1/2.2.8)
    • Fix memory leak during decoding of some invalid Exif blocks. #2824
    • Fix possible divide-by-zero error in read_image/read_scanlines for invalid image sizes (usually from corrupt files). #2983 (2.3.5/2.2.16)

    Developer goodies / internals:

    • Internals now use C++11 final keywords wherever applicable. #2734 (2.3.0.1)
    • More internals conversion of old Strutil::sprintf to Strutil::fmt::format and related changes. #2889 (2.3.3)
    • Redundant format conversion code removed from imageio.cpp #2907 (2.3.4)
    • Eliminate direct output to std::cerr and std::cout by library calls. #2923 (2.3.4)
    • argparse.h:
      • ArgParse::abort() lets the response to a command line argument signal that no further arguments should be parsed. #2820 (2.3.3/2.2.11)
    • color.h:
      • New ColorConfig::OpenColorIO_version_hex() returns the hex code for the version of OCIO we are using (0 for no OCIO support). #2849 (2.3.3)
    • farmhash.h:
      • Clean up all non-namespaced preprocessor symbols that are set by this header and may pollute the caller's symbols. #3002 (2.2.16/2.3.6)
    • filesystem.h:
      • New Filesystem::generic_filepath() returnss a filepath in generic format (not OS specific). #2819 (2.3.3/2.2.11)
      • Improve exception safety in Filesystem directory iteration. #2998 (2.2.16/2.3.6)
      • New filename_to_regex() makes a filename "safe" to use as a regex pattern (for example, properly backslashing any . characters). #3046 (2.3.7)
      • Some methods that used to take a const std::string& now take a string_view. #3047 (2.3.7)
    • fmath.h:
      • Use CPU intrinsics to speed up swap_ending (by 8-15x when swapping bytes of large arrays). #2763 (2.3.1.0)
    • hash.h:
      • farmhash::inlined::Hash now is constexpr and works for Cuda. #2843 (2.3.3) #2914 #2930 (2.3.4)
    • oiioversion.h:
      • New macros OIIO_VERSION_GREATER_EQUAL and OIIO_VERSION_LESS. #2831 (2.3.3/2.2.11)
    • platform.h:
      • New macro OIIO_INLINE_CONSTEXPR, equivalent to inline constexpr for C++17, but just constexpr for C++ <= 14. #2832 (2.3.3/2.2.11)
    • simd.h:
      • Fix incorrect ARM NEON code in simd.h. #2739 (2.3.0.1/2.2.8)
    • span.h:
      • std::size() and std::ssize() should work with OIIO::span now. #2827 (2.3.3/2.2.11)
    • string_view.h:
      • std::size() and std::ssize() should work with OIIO::string_view now. #2827 (2.3.3/2.2.11)
      • More thorough constexr of string_view methods. #2841 (2.3.3)
    • strongparam.h:
      • New StrongParam helper for disambiguating parameters. #2735 (2.3.2)
    • strutil.h:
      • Strutil splits() and splitsv() should return no pieces when passed an empty string. (It previously erroneously returned one piece consisting of an empty string.) #2712 (2.3.0.0)
      • Fix build break when strutil.h was included in Cuda 10.1 code. #2743 (2.3.0.1/2.2.8)
      • strhash() is now constexpr for C++14 and higher. #2843 (2.3.3)
      • New Strutil functions: find, rfind, ifind, irfind #2960 (2.3.4/2.2.14) contains_any_char #3034 (2.3.7) rcontains, ircontains #3053 (2.3.7)
    • sysutil.h:
      • Extend getenv() to take a default if the environment variable is not found. #3037 #3040 (2.3.7)
    • typedesc.h:
      • TypeDesc::basetype_merge(a,b) returns a BASETYPE having the precision and range to hold the basetypes of either a or b. #2715 (2.3.0.0)
      • TypeDesc can now describe 2D and 3D bounding boxes, as arrays of 2 VEC2 aggregates (for 2D) or VEC3 aggregates (for 3D) with "BOX" semantic. The shorthand for these are TypeBox2, TypeBox3 (for float), and TypeBox2i and TypeBox3i for integer or pixel coordinte boxes. #3008 (2.2.17/2.3.6)
    • unordered_map_concurrent.h:
      • New methods find_or_insert, nobin_mask(). #2867 (2.2.12/2.3.3)
    • ustring.h:
      • ustring internals now have a way to ask for the list of ustrings whose hashses collided. #2786 (2.2.11/2.3.2.0)
      • ustring now guarantees that no two ustrings will return the exact same value for hash(). #2870 (2.3.3)

    Build/test system improvements and platform ports:

    • CMake build system and scripts:
      • Instead of defaulting to looking for Python 2.7, the OIIO build now defaults to whatever Python is found (though a specific one can still be requested via the PYTHON_VERSION variable). #2705 (2.3.0.0/2.2.8) #2764 (2.3.0.1/2.2.8)
      • Make the OIIO CMake files work properly if OIIO is a subproject. Also various other CMake script refactoring. #2770 (2.3.1.1/2.2.9)
      • Extend checked_find_package with VERSION_MIN and VERSION_MAX #2773 (2.3.1.1/2.2.9), DEFINITIONS and SETVARIABLES #3061 (2.3.7)
      • No longer directly link against python libraries when unnecessary. #2807 (2.2.11/2.3.3)
      • On Windows, fix some linkage problems by changing the pybind11 bindings to make a CMake "shared" library rather than "module". Sounds wrong, but seems to work. We will reverse if this causes problems. #2830 (2.3.3/2.2.11)
      • Improvements to building or linking static libraries. #2854 (2.2.12/2.3.3)
      • Change default STOP_ON_WARNING to OFF for release branches (including this one) so that small change in compiler warnings after our release don't break anybody's builds. (Though we still stop on warnings for CI builds). #2861 (2.2.12/2.3.3)
      • The pkgconfig OpenImageIO.pc was specifying the include path incorrectly. #2869 (2.2.12/2.3.3)
      • Support for CMake 3.20. #2913 #2931 (2.3.4)
      • Be sure to have the namespace include the patch number for pre-release builds from the master branch. #2948 (2.3.4)
      • Use modern style cmake targets for PNG and ZLIB dependencies. #2957 (2.3.4)
      • Propagate C++14 minimum requirement to downstream projects via our cmake config exports. #2965 (2.3.5)
      • Fix exported cmake config files, which could fail if Imath and OpenEXR weren't the at the same version number. #2975 (2.3.5/2.2.15)
      • Change default postfix for debug libraries to _d. (2.3.5)
      • Our CMake checked_find_package is now able to be requested to favor an exported config file, if present, on a package-by-package basis. #2984 (2.3.5/2.2.15)
      • If a package is requested to be disabled, skip its related tests rather than reporting them as broken. #2988 (2.3.5/2.2.16)
      • Better support for running testsuite when the build dir in odd places. #3065 #3067 (2.3.7.1)
      • To prevent accidental overwrite of sensitive areas (such as /usr/local), you now need to explicitly set CMAKE_INSTALL_PREFIX if you want the "install" to not be local to the build area. #3069 (2.3.7.1)
    • Dependency version support:
      • C++20 is now supported. #2891 (2.3.3)
      • Fix deprecation warnings when building with very new PugiXML versions. #2733 (2.3.0.1/2.2.8)
      • Fixes to build against OpenColorIO 2.0. #2765 (2.3.0.1/2.2.8) #2817 #2849 (2.3.3/2.2.11) #2911 (2.3.4)
      • Fix to accommodate upcoming OpenColorIO 2.1 deprecation of parseColorSpaceFromString. #2961 (2.3.5/2.2.15)
      • Work to ensure that OIIO will build correctly against Imath 3.0 and OpenEXR 3.0, as well as Imath 3.1 / OpenEXR 3.1. #2771 (2.3.1.1/2.2.9) #2876 #2678 #2883 #2894 (2.3.3/2.2.12) #2935 #2941 #2942 #2947 (2.3.4)
      • Better finding of OpenJpeg 2.4. #2829 (2.3.3/2.2.11)
      • On Mac, libheif 1.10 is very broken. Don't use that version. #2847 (2.3.3/2.2.11)
      • Fix build break against changes coming in future libtiff, where it is changing from some libtiff-defined integer types to the equivalent stdint.h types. #2848 (2.3.3/2.2.11)
      • Fixes to support the libraw 202101 snapshot (their in-progress 0.21.0). #2850 (2.3.3/2.2.11)
      • More clear warnings about using OpenVDB 8+ when building for C++11, because OpenVDB 8 requires C++14 or higher. #2860 (2.2.12/2.3.3)
      • More gracefully handle building against a custom Imath/OpenEXR even when another exists in the system area. #2876 (2.2.12/2.3.3)
      • Minor fixes to build cleanly against the upcoming Imath 3.0. #2878 (2.2.12/2.3.3)
      • Remove obsolete dependency on Boost random (now use std::random). #2896 (2.3.3)
      • libtiff 4.3 is supported. #2953 (2.3.4)
      • We now include a build_OpenJPEG.bash script that can conveniently build a missing OpenJPEG dependency. (2.3.5/2.2.16)
      • Changes to make it build against TBB 2021. #2985 (2.3.5/2.2.15)
      • Support for building OIIO with gcc 11. #2995 (2.2.16/2.3.6)
      • Fixes to accommodate Imath 3.1 upcoming changes. #2996 (2.2.16/2.3.6)
      • Finding FFMpeg now correctly detects the version. #2994 (2.2.16/2.3.6)
      • FFMpeg minimum version is now >= 3.0. #2999 (2.3.6)
      • Fixes for detecting and using Ptex, among other things got the version wrong. #3001 (2.2.16/2.3.6)
      • Fixes for building against fmt 8.0. #3007 (2.3.6)
      • The OpenCV minimum version is now >= 3.0. #3015 (2.3.6)
      • Fixes to build properly against the upcoming OpenColorIO 2.1. #3050 (2.3.7)
      • Finding boost is more flexible when desiring static libraries. #3031 (2.3.7/2.2.17)
      • FindTBB.cmake module updated to create proper targets. #3060 (2.3.7)
      • All the src/build_scripts/build_*.bash scripts now honor an env variable called DEP_DOWNLOAD_ONLY, which if set will only do the downloads but not the builds. #3058 #3072 (2.3.7)
      • Better finding of OpenCV on Windows. #3062 (2.3.7.1)
    • Testing and Continuous integration (CI) systems:
      • Completely get rid of the old appveyor CI. #2782 (2.3.2.0)
      • Test against libtiff 4.2 in the "latest releases" test. #2792 (2.3.2.0)
      • Got Windows CI fully working, bit by bit. #2796 #2798 #2805 #2821 #2826 #2834 #2835 #2836 #2838 #2839 #2840 (2.3.3)
      • Reduce redundant verbosty in CI output logs during dependency building.
      • Modify hash_test to verify correctness and stability of the hashes. #2853 (2.3.3)
      • When building custom OpenEXR with build_openexr.bash, don't have it build the examples. #2857 (2.2.12/2.3.3)
      • Speed up CI by using GitHub 'cache' actions + ccache. #2859 (2.2.12/2.3.3)
      • Separate stages (setup, deps, build, test) into separate GHA "steps" for better logging and understanding of the timing and performance. #2862 (2.2.12/2.3.3)
      • Now actively testing libheif in Linux CI. #2866 (2.2.12/2.3.3)
      • Remove the last vestiges of Travis-CI, which we no longer use. #2871 (2.2.12/2.3.3)
      • For failed tests, add CMake cache and log part of the saved artifacts. (2.2.12/2.3.3)
      • CI now tests build in C++20 mode. #2891 (2.3.3)
      • Our CI clang-format test now uses LLVM/clang-format 11. #2966
      • Test the clang11 + C++17 combo. #3004 (2.3.6)
    • Platform support:
      • Fixes for mingw. #2698 (2.3.0.0)
      • Windows fix: correct OIIO_API declaration on aligned_malloc, aligned_free of platform.h. #2701 (2.3.0.0)
      • Fix boost linkage problem on Windows. #2727 (2.3.0.1/2.2.8)
      • Fix warnings when compiling webpinput.cpp on 32 bit systems. #2783 (2.3.2.0)
      • Fix problems with copysign sometimes defined as a preprocessor symbol on Windows. #2800 (2.3.2)
      • Fixes related to Mac M1-based systems: Fix crash in ustring internals #2990 (2.3.5/2.2.15.1)

    Notable documentation changes:

    • Make Readthedocs generate downloadable HTML as well as PDF. #2746
    • Explain how to read image data into separate per-channel buffers. #2756 (2.3.0.1/2.2.8)
    • Improve use of breathe and formatting. #2762 (2.3.1.0)
    • Remove documentation of deprecated ImageBufAlgo functions. #2762 (2.3.1.0)
    • Document missing texture option fields. #2762 (2.3.1.0)
    • Starting to use "sphinx_tabs" as a clear way to present how things should be done for different language bindings. #2768 (2.3.1.0)
    Source code(tar.gz)
    Source code(zip)
  • v2.2.18.0(Sep 1, 2021)

    Release 2.2.18 (1 Sep 2021) -- compared to 2.2.17

    • Honor env variable CUE_THREADS (used by OpenCue) to set the default size of OIIO's thread pool. #3038
    • Compatibility with OpenColorIO 2.1. #3050
    • Dev: Extend Sysutil::getenv() to take a default if the environment variable is not found. #3047 #3048
    Source code(tar.gz)
    Source code(zip)
  • v2.3.7.0-beta(Aug 18, 2021)

    At long last, I have branched for this year's big release, OpenImageIO 2.3. The new branch is "dev-2.3" (a change from the old convention of RB-x.y; I think it's clearer since many people didn't know what RB stood for), and the first beta is tagged "v2.3.7.0-beta". Why 2.3.7.0? Because we had 6 "developer preview" snapshots along the way.

    I'm aiming for September 1, 2021 to tag a release. It might get delayed if serious problems are discovered. But considering that SPI and probably lots of other places use master branch or developer preview snapshots for real production, for anything other changes made in the last couple weeks, I'm pretty confident that everything is solid and has already been through the heat of battle in production. In general, the only difference between our release branches and master is that release branches make a strict promise about not breaking compatibility; there is little practical difference in stability or production worthiness.

    We will strive to make no breaking changes to the API or ABI between now and the release. After final release, when the beta designation disappears, we will be 100% strict about this promise.

    We will keep releasing 2.2.x patches as needed, but they will slow down and be restricted to only critical bug fixes, as we transition to 2.3 being the current supported release. Meanwhile, master -- which is now the staging area for what will become 2.4 next year -- is where big new, and possibly compatibility-breaking, changes will be made.

    Release 2.3 (1 Sept 2021?) -- compared to 2.2

    New minimum dependencies and compatibility changes:

    • C++ standard: C++14 is now the minimum (gcc 6.1 - 11.2, clang 3.4 - 12, MSVS 2017 - 2019, icc 17+). The default C++ standard mode, if none is explicitly specified, is now C++14. #2918 (2.3.4) #2955 #2977 (2.3.5)
    • FFMmpeg (optional) dependency minimum is now 3.0 (raised from 2.6). #2994
    • OpenCV (optional) dependency minimum is now 3.0 (raised from 2.0). #3015

    New major features and public API changes:

    • Changes and clarifications to geterror() in all classes that have one:
      • geterror() now takes an optional clear parameter controls if the pending error is cleared as well as retrieved (default true).
      • All classes with geterror() are ensured to have has_error().
      • geterror() appends to the pending error message, if one is already present but not retrieved. Appending errors will be automatically separated by newlines, also any newline at the end of a geterror call will be stripped. #2740 (2.3.0.1)
    • ImageInput error messages are now thread-specific. This prevents multiple threads simultaneously reading from the same ImageInput from getting the other thread's error messages. But it means you must always retrieve an error with getmessage() from the same thread that made the read call that generated the error. #2752 (2.3.0.1)
    • ImageInput and ImageOutput have removed several fields (like the m_mutex) and instead now use a PIMPL idiom that hides internals better from the ABI. If you had a custom ImageInput/Output class that directly accessed the m_mutex, replace it instead with calls to ImageInput::lock() and unlock() (and ImageOutput). #2752 (2.3.1.0)
    • Clarify that ImageBuf methods subimage(), nsubimages(), miplevel(), nmipevels(), and file_format_name() refer to the file that an ImageBuf was read from, and are thus only meaningful for ImageBuf's that directly read from files. "Computed" or copied ImageBuf's are solo images in memory that no longer correspond to a file even if the input to the computation was from a file. #2759 (2.3.0.1/2.2.9)
    • New get_extension_map() returns a map that list all image file formats and their presumed file extensions. #2904 (2.3.4)
    • Overhaul of how we handle "thumbnails" (small preview images embedded in the headers of some image file formats) #3021 (2.3.7):
      • Thumbnails no longer embedded in the ImageSpec as "thumbnail_image" metadata of a big character array blob.
      • ImageInput, ImageBuf, and ImageCache have varieties of get_thumbnail() method that returns the thumbnail as an ImageBuf. If this is not called, ideally the reader will not undergo the expense of reading and storing thumbnail data.
      • ImageOutput and ImageBuf have set_thumbnail() to communicate a thumbnail image as an ImageBuf.
      • The net effect is that reading files and retrieving ImageSpec's should be more efficient for apps that don't have a use for thumbnails.
    • Significant improvements to UDIM handling in ImageCache/TextureSystem:
      • New UDIM texture name patterns recognized: %(UDIM)d is the Houdini convention, and _u##v## is for Animal Logic's internal renderer. #3006 (2.2.16/2.3.6)
      • It is now permissible for get_texture_info()/get_image_info() to retrieve metadata for UDIM patterns -- previously it failed, but now it will succeed in retrieving any metadata as long as it is present and has the same value in all the matching "UDIM tile" panels. #3049 (2.3.7)
      • TextureSystem now exposes methods is_udim(), resolve_udim(), inventory_udim() that should be helpful for apps dealing with UDIM textures. See the documentation for details. #3054 (2.3.7)
      • Performance improvements when using UDIM textures. #3049 (2.3.7)
    • ImageBuf, when "wrapping" an app-owned buffer, now allows explicit specification of stride lengths. This allows you to wrap a buffer that has internal padding or other non-contiguous spacing of pixels, scanlines, or image planes. #3022 (2.3.6)
    • oiiotool new commands and options:
      • --pastemeta takes two images as arguments, and appends all the metadata (only) from the first image onto the second image's pixels and metadata, producing a combined image. #2708 (2.3.0.0)
      • --chappend and --siappend both allow an optional modifier :n= to specify the number of images from the stack to be combined (default n=2). #2709 (2.3.0.0)
      • --fit now takes an additional optional modifier: fillmode= with choices of letterbox (default), width, and height. #2784 (2.3.2.0)
      • --autocc now has an optional modifier :unpremult=1 that causes any color transformations related to autocc to unpremultiply by alpha before the transformation and then re-premultiply afterwards, exactly the same control that exists for individual --colorconvert but never existed for autocc. #2890 (2.3.3)
      • --list-formats lists all the image file formats that OIIO knows about, and for each, the associated file extensions. #2904 (2.3.4)
      • --skip-bad-frames causes an error (such as an input file not being found) to simply skip to the next frame in the frame range loop, rather that immediately exiting. #2905 (2.3.4)
      • When doing expression substitution, {getattribute(name)} will be replaced by the value that OIIO::getattribute(name, ...) would retrieve. #2932 (2.3.4)
      • --missingfile (which takes a subsequent argument of error, black, or checker) determines the behavior when an input image file is missing (the file does not exist at all, does not include cases where the file exists but there are read errors). The default value of error matches the old behavior: report an error and terminate all command processing. Other choices of black or checker will continue processing but substitute either a black or checkerboard image for the missing file. #2949 (2.3.4)
      • --printinfo prints verbose metadata info about the current top image on the stack. #3056 (2.3.7)
      • --printstats prints statistics about the current top image on the stack, and optionally can limit the statistics to a rectangular subregion of the image. #3056 (2.3.7)
      • Expanded expression now support the following new metadata notations: META, METABRIEF, and STATS. #3025 (2.3.6)
      • --mosaic now takes optional fit=WxH modifier that lets you set the "cell" size, with all constituent images resized as needed (similarly to if you used --fit on each individually). This is helpful for creating contact sheets without having to resize separately or to know the resolution of the original images. #3026 (2.3.6)
      • REMOVED --histogram which had been deprecated and undocumented since before OIIO 2.0. #3029 (2.3.6)
    • Python bindings:
      • When transferring blocks of pixels (e.g., ImageInput.read_image() or ImageOutput.write_scanline()), "half" pixels ended up mangled into uint16, but now they use the correct numpy.float16 type. #2694 (2.3.0.0)
      • The value passed to attribute(name, typedesc, value) can now be a tuple, list, numpy array, or scalar value. #2695 (2.3.0.0)
      • Added Python bindings for the TextureSystem. #2842
      • Add the previously (inadvertently) omitted enum value for ImageBufAlgo.MakeTxBumpWithSlopes. #2951 (2.3.4)
    • Environment variables:
      • CUE_THREADS env variable, if set, is now honored to set the default size of the OIIO thread pool. This helps to make OIIO-based apps be good citizens when run as OpenCue jobs. #3038 (2.3.7)
    • Library organization:
      • All the utility classes are now in libOpenImageIO_Util only and libOpenImageIO depends on and links to libOpenImageIO_Util, rather than the utility classes being defined separately in both libraries. #2906 (2.3.4)
      • Include file change: imagebuf.h no longer includes imagecache.h. It should never have needed to, since it didn't need any of its declarations. Other code that should always have included both headers, but inadvertently only included imagebuf.h, may now need to add an explicit #include <OpenImageIO/imagecache.h>. #3036 (2.3.7)
    • Important change to Makefile wrapper: We have a 'Makefile' that just wraps cmake for ease of use. This has changed its practice of putting builds in build/ARCH to just build (and local installs from dist/ARCH to dist) to better match common cmake practice. So where your local builds end up may shift a bit. #3057 (2.3.7)
    • Deprecations: A number of long-deprecated functions and methods have been given deprecation attributes that will cause warnings if you use them. They will eventually be removed entirely at the next "breaking" release (3.0, whenever that is). #3032 (2.3.7)

    Performance improvements:

    • Speed up BMP reading by eliminating wasteful allocation and copying done on each scanline read. #2934 (2.3.4)
    • For IBA::to_OpenCV(), improve efficiency for certain image copies. #2944 (2.3.4)
    • Fix runaway parsing time for pathological XMP metadata. #2968 (2.3.5/2.2.15)
    • TextureSystem reduction in overhead when using UDIM textures. #3049 (2.3.7)

    Fixes and feature enhancements:

    • Fix a situation where if an ImageBuf backed by an ImageCache reads an image, then the image changes on disk, then another ImageBuf or ImageCache tries to read it, it could end up with the old version. This involved some strategic cache invalidation when ImageBuf's write images to disk. #2696 (2.3.0.0)
    • Improve parsing of XMP records in metadata: more correct handling of lists/sequences, better inference of types that look like int or float (rather than forcing unknown fields into strings), fixed bugs in parsing rational values. #2865 (2.2.12/2.3.3)
    • ImageBuf/ImageBufAlgo:
      • IBA::contrast_remap() fixes bug that could crash for very large images #2704 (2.3.0.0)
      • Fix stack overflow crash in IBA::colorconvert of unusually wide images. #2716 (2.3.0.1/2.2.8)
      • Fix IBA::make_texture() incorrectly setting tile sizes. #2737 (2.3.0.1/2.2.8)
      • IBA::make_texture() now correctly propagates error messages, which can be retrieved via the global OIIO::geterror() call. #2747 (2.3.0.1)
      • IBA::fit() now takes a fillmode parameter that controls exactly how the resize will occur in cases where the aspect ratio of the new frame doesn't exactly match that of the source image. The old way (and the default value now) is "letterbox", but now also "width" and "height" modes are allowed. See fit() documentation for details. #2784 (2.3.2.0)
      • IBA::fit() fixes some slight ringing at image edges when using a combination of black wrap mode and a filter with negative lobes. #2787 (2.3.2.0)
      • Fix: ociolook() and ociofiletransform() internally reversed the order of their inverse and unpremult arguments, making it hard to select the inverse transformation. #2844 (2.3.3/2.2.11)
      • Fix crash for certain calls to ImageBuf::set_write_format() when writing files that support per-channel data types. #2885 (2.3.3)
      • Fix: IBA::fillholes_pushpull did not correctly understand which channel was alpha when generating subimages. #2939 (2.3.4)
      • Fix: IBA::render_text did not properly account for non-1 alpha of the text color. #2981 (2.3.5/2.2.15)
      • IBA::colorconvert, colormatrixtransform, ociolook, ociodisplay, and ociofiletransform have been fixed so that if input is more than 4 channels, the additional channels will be copied unchanged, rather than inadvertently set to 0. #2987 (2.3.5/2.2.16)
      • Thread safety has been improved for ImageBuf::init_spec() and read() (though no problem was ever reported in the wild). #3018 (2.3.6)
      • render_text() now accepts text strings with embedded linefeeds and will turn them into multiple lines of rendered text. #3024 (2.3.6)
    • ImageCache/TextureSystem/maketx:
      • Fix ImageCache bug: add_tile/get_tile not properly honoring when chend < chbegin it should get all channels. #2742 (2.3.0.1/2.2.8)
      • ImageBufAlgo::make_texture() (as well as maketx and oiiotool -otex) clamp half values to their maximum finite range to prevent very large float inputs turning into Inf when saved as half values. #2891 (2.3.3)
      • Fix crash when sampling non-zero-base channels. #2962 (2.3.5/2.2.15)
      • IBA::make_texture() rejects "deep" input images, since they cannot be made into textures. Doing this could previously crash. #2991 (2.3.5/2.2.16)
      • maketx and oiiotool -otex have fixed double printing of error messages #2992 (2.3.5).
      • Making bumpslopes textures now allows scaled slopes UV normalization. This is exposed as new maketx argument --uvsopes_scale, or passing the attribute uvslopes_scale (int) to make_texture(). #3012 (2.3.6)
      • There is a new variety of ImageCache::invalidate() that takes an ImageHandle* argument instead of a filename. #3035 (2.3.7)
    • oiiotool:
      • --resize of images with multi-subimages could crash. #2711 (2.3.0.0)
      • Improve oiiotool's guessing about the desired output format based on inputs (in the absence of -d to specify the format). #2717 (2.3.0.1/2.2.8)
      • --text now accepts text strings with embedded linefeeds and will turn them into multiple lines of rendered text. #3024 (2.3.6)
    • BMP
      • Fix reading BMP images with bottom-to-top row order. #2776 (2.3.1.1/2.2.9)
      • Correctly read BMP images of the older V1 variety without crashing. #2899 (2.3.3/2.2.13)
      • Fix error in the rightmost pixel column when reading 4 bpp images with odd horizontal resolution. #2899 (2.3.3/2.2.13)
      • BMP reads now return metadata "bmp:bitsperpixel" (only when not 24 or 32) to indicate non-whole-byte channels sizes in the file, and "bmp:version" to indicate the version of the BMP format. #2899 (2.3.3/2.2.13)
      • Speed up BMP reading by eliminating wasteful allocation and copying done on each scanline read. #2934 (2.3.4)
      • For BMP files that are 8 bits per pixel and all palette entries have R == G == B values, read the file as an 8-bit grayscale image instead of needlessly promoting to a full RGB 3-channel image. #2943 (2.3.4)
      • Full support for reading RLE-compressed BMP images. #2976 (2.3.5/2.2.15)
      • Write single channel BMP as 8 bit palette images. #2976 (2.3.5/2.2.15)
    • DPX
      • Output to DPX files now supports IOProxy. (Input already did.) #3013 (2.2.17/2.3.6)
    • FFMpeg/movies:
      • Avoid potential crash when a frame can't be read. #2693 (2.3.0.0)
      • Several varieties of encoded videos with 12 bits per channel and having alpha were incorrectly reported as 8 bits and without alpha. #2989 (2.3.5/2.2.16)
    • GIF
      • Support UTF-8 filenames on Windows for GIF files. #2777 (2.3.2.0)
      • Fix error checking for non-existant GIF files. #2886 (2.3.3)
    • HEIC
      • Fix error decoding Apple HEIF files. #2794/#2809 (2.3.2.0)
      • Better valid_file() check for HEIF. #2810 (2.3.2.0)
      • Enabled AVIF decoding of heic files (requires libheif >= 1.7 and for it to have been built with an AV1 encoder/decoder). #2811 #2812 #2814 #2818 (2.3.3.0)
    • IFF
      • Fix broken reads of 16 bit iff files. #2736 (2.3.0.1/2.2.8)
    • JPEG
      • Allow reading of JPEG files with mildly corrupted headers. #2927 (2.3.4)
    • OpenEXR:
      • Fix rare crash that was possible when multithreaded writing openexr files. #2781 (2.3.2.0)
      • Improved error reporting when errors are encountered writing OpenEXR files. #2783 (2.3.2.0)
      • Fix potential crash parsing OpenEXR header that contains Rational attributes with certain values. #2791 (2.2.10/2.3.2)
      • EXPERIMENTAL: When building against OpenEXR 3.1, the OIIO CMake option -DOIIO_USE_EXR_C_API=ON will use a new OpenEXR API that we think will allow higher performance texture reads in a multithreaded app. This has not yet been benchmarked or tested thoroughly. #3009 #3027 (2.3.6)
      • The reader no longer renames file metadata "version" into the special "openexr:version" that would indicate the OpenEXR file format version of the file. That's never what it meant! It really was just arbitrary metadata. #3044 (2.3.7)
    • PNG
      • Read Exif data from PNG files. #2767 (2.3.1.1/2.2.9)
    • PSD
      • Add support for reading ISD profiles for PSD input. #2788 (2.3.2.0)
      • Fix loading PSB files with cinf tags. #2877 (2.2.12/2.3.2)
    • RAW:
      • Additional input configuration hints to control options in the underlying LibRaw: "raw:user_flip" #2769 (2.3.1.0) "raw:balance_clamped", "raw:apply_scene_linear_scale", "raw:camera_to_scene_linear_scale" #3045 (2.3.7)
      • Correctly handle RAW files with Unicode filenames on Windows. #2888 (2.3.3)
      • Fix garbled output when raw:Demosaic hint is "none". #3045 (2.3.7)
    • Targa
      • Fix potential crash when reading files with no thumbnail. #2903 (2.3.3/2.2.13)
      • Fix alpha handling for some files. #3019 (2.3.6)
    • TIFF:
      • Fix broken reads of multi-subimage non-spectral files (such as photometric YCbCr mode). #2692 (2.3.0.0)
      • Fix spec() and spec_dimensions() for MIPmapped TIFF files, they did not recognize being asked to return the specs for invalid subimage indices. #2723 (2.3.0.1/2.2.7)
      • Add ability to output 1bpp TIFF files. #2722 (2.3.0.1/2.2.7)
      • Fix reading TIFF files with "separate" planarconfig and rowsperstrip more than 1. #2757 (2.3.0.1/2.2.9)
      • Fix incorrect reading of tiled TIFF files using certain rare TIFF features that also have a vertical resolution that is not a whole multiple of the tile size. #2895 (2.3.3/2.2.13)
      • Support IOProxy for reading TIFF files. #2921 (2.3.4)
      • TIFF plugin now properly honors caller request for single-threaded operation. #3016 (2.3.6)
    • WebP:
      • Add support for requesting compression "lossless". #2726 (2.3.0.1/2.2.8)
      • Input improvements including: RGB images are kept as RGB instead of always adding alpha; more efficient by skipping alpha premultiplication when it's unnecessary; now can read animated WebP images as multi-subimage files. #2730 (2.3.0.1/2.2.8)
    • Fix memory leak during decoding of some invalid Exif blocks. #2824
    • Fix possible divide-by-zero error in read_image/read_scanlines for invalid image sizes (usually from corrupt files). #2983 (2.3.5/2.2.16)

    Developer goodies / internals:

    • Internals now use C++11 final keywords wherever applicable. #2734 (2.3.0.1)
    • More internals conversion of old Strutil::sprintf to Strutil::fmt::format and related changes. #2889 (2.3.3)
    • Redundant format conversion code removed from imageio.cpp #2907 (2.3.4)
    • Eliminate direct output to std::cerr and std::cout by library calls. #2923 (2.3.4)
    • argparse.h:
      • ArgParse::abort() lets the response to a command line argument signal that no further arguments should be parsed. #2820 (2.3.3/2.2.11)
    • color.h:
      • New ColorConfig::OpenColorIO_version_hex() returns the hex code for the version of OCIO we are using (0 for no OCIO support). #2849 (2.3.3)
    • farmhash.h:
      • Clean up all non-namespaced preprocessor symbols that are set by this header and may pollute the caller's symbols. #3002 (2.2.16/2.3.6)
    • filesystem.h:
      • New Filesystem::generic_filepath() returnss a filepath in generic format (not OS specific). #2819 (2.3.3/2.2.11)
      • Improve exception safety in Filesystem directory iteration. #2998 (2.2.16/2.3.6)
      • New filename_to_regex() makes a filename "safe" to use as a regex pattern (for example, properly backslashing any . characters). #3046 (2.3.7)
      • Some methods that used to take a const std::string& now take a string_view. #3047 (2.3.7)
    • fmath.h:
      • Use CPU intrinsics to speed up swap_ending (by 8-15x when swapping bytes of large arrays). #2763 (2.3.1.0)
    • hash.h:
      • farmhash::inlined::Hash now is constexpr and works for Cuda. #2843 (2.3.3) #2914 #2930 (2.3.4)
    • oiioversion.h:
      • New macros OIIO_VERSION_GREATER_EQUAL and OIIO_VERSION_LESS. #2831 (2.3.3/2.2.11)
    • platform.h:
      • New macro OIIO_INLINE_CONSTEXPR, equivalent to inline constexpr for C++17, but just constexpr for C++ <= 14. #2832 (2.3.3/2.2.11)
    • simd.h:
      • Fix incorrect ARM NEON code in simd.h. #2739 (2.3.0.1/2.2.8)
    • span.h:
      • std::size() and std::ssize() should work with OIIO::span now. #2827 (2.3.3/2.2.11)
    • string_view.h:
      • std::size() and std::ssize() should work with OIIO::string_view now. #2827 (2.3.3/2.2.11)
      • More thorough constexr of string_view methods. #2841 (2.3.3)
    • strongparam.h:
      • New StrongParam helper for disambiguating parameters. #2735 (2.3.2)
    • strutil.h:
      • Strutil splits() and splitsv() should return no pieces when passed an empty string. (It previously erroneously returned one piece consisting of an empty string.) #2712 (2.3.0.0)
      • Fix build break when strutil.h was included in Cuda 10.1 code. #2743 (2.3.0.1/2.2.8)
      • strhash() is now constexpr for C++14 and higher. #2843 (2.3.3)
      • New Strutil functions: find, rfind, ifind, irfind #2960 (2.3.4/2.2.14) contains_any_char #3034 (2.3.7) rcontains, ircontains #3053 (2.3.7)
    • sysutil.h:
      • Extend getenv() to take a default if the environment variable is not found. #3037 #3040 (2.3.7)
    • typedesc.h:
      • TypeDesc::basetype_merge(a,b) returns a BASETYPE having the precision and range to hold the basetypes of either a or b. #2715 (2.3.0.0)
      • TypeDesc can now describe 2D and 3D bounding boxes, as arrays of 2 VEC2 aggregates (for 2D) or VEC3 aggregates (for 3D) with "BOX" semantic. The shorthand for these are TypeBox2, TypeBox3 (for float), and TypeBox2i and TypeBox3i for integer or pixel coordinte boxes. #3008 (2.2.17/2.3.6)
    • unordered_map_concurrent.h:
      • New methods find_or_insert, nobin_mask(). #2867 (2.2.12/2.3.3)
    • ustring.h:
      • ustring internals now have a way to ask for the list of ustrings whose hashses collided. #2786 (2.2.11/2.3.2.0)
      • ustring now guarantees that no two ustrings will return the exact same value for hash(). #2870 (2.3.3)

    Build/test system improvements and platform ports:

    • CMake build system and scripts:
      • Instead of defaulting to looking for Python 2.7, the OIIO build now defaults to whatever Python is found (though a specific one can still be requested via the PYTHON_VERSION variable). #2705 (2.3.0.0/2.2.8) #2764 (2.3.0.1/2.2.8)
      • Make the OIIO CMake files work properly if OIIO is a subproject. Also various other CMake script refactoring. #2770 (2.3.1.1/2.2.9)
      • Extend checked_find_package with VERSION_MIN and VERSION_MAX #2773 (2.3.1.1/2.2.9), DEFINITIONS and SETVARIABLES #3061 (2.3.7)
      • No longer directly link against python libraries when unnecessary. #2807 (2.2.11/2.3.3)
      • On Windows, fix some linkage problems by changing the pybind11 bindings to make a CMake "shared" library rather than "module". Sounds wrong, but seems to work. We will reverse if this causes problems. #2830 (2.3.3/2.2.11)
      • Improvements to building or linking static libraries. #2854 (2.2.12/2.3.3)
      • Change default STOP_ON_WARNING to OFF for release branches (including this one) so that small change in compiler warnings after our release don't break anybody's builds. (Though we still stop on warnings for CI builds). #2861 (2.2.12/2.3.3)
      • The pkgconfig OpenImageIO.pc was specifying the include path incorrectly. #2869 (2.2.12/2.3.3)
      • Support for CMake 3.20. #2913 #2931 (2.3.4)
      • Be sure to have the namespace include the patch number for pre-release builds from the master branch. #2948 (2.3.4)
      • Use modern style cmake targets for PNG and ZLIB dependencies. #2957 (2.3.4)
      • Propagate C++14 minimum requirement to downstream projects via our cmake config exports. #2965 (2.3.5)
      • Fix exported cmake config files, which could fail if Imath and OpenEXR weren't the at the same version number. #2975 (2.3.5/2.2.15)
      • Change default postfix for debug libraries to _d. (2.3.5)
      • Our CMake checked_find_package is now able to be requested to favor an exported config file, if present, on a package-by-package basis. #2984 (2.3.5/2.2.15)
      • If a package is requested to be disabled, skip its related tests rather than reporting them as broken. #2988 (2.3.5/2.2.16)
      • Finding boost is more flexible when desiring static libraries. #3031 (2.3.7/2.2.17)
      • FindTBB.cmake module updated to create proper targets. #3060 (2.3.7)
    • Dependency version support:
      • C++20 is now supported. #2891 (2.3.3)
      • Fix deprecation warnings when building with very new PugiXML versions. #2733 (2.3.0.1/2.2.8)
      • Fixes to build against OpenColorIO 2.0. #2765 (2.3.0.1/2.2.8) #2817 #2849 (2.3.3/2.2.11) #2911 (2.3.4)
      • Fix to accommodate upcoming OpenColorIO 2.1 deprecation of parseColorSpaceFromString. #2961 (2.3.5/2.2.15)
      • Work to ensure that OIIO will build correctly against Imath 3.0 and OpenEXR 3.0, as well as Imath 3.1 / OpenEXR 3.1. #2771 (2.3.1.1/2.2.9) #2876 #2678 #2883 #2894 (2.3.3/2.2.12) #2935 #2941 #2942 #2947 (2.3.4)
      • Better finding of OpenJpeg 2.4. #2829 (2.3.3/2.2.11)
      • On Mac, libheif 1.10 is very broken. Don't use that version. #2847 (2.3.3/2.2.11)
      • Fix build break against changes coming in future libtiff, where it is changing from some libtiff-defined integer types to the equivalent stdint.h types. #2848 (2.3.3/2.2.11)
      • Fixes to support the libraw 202101 snapshot (their in-progress 0.21.0). #2850 (2.3.3/2.2.11)
      • More clear warnings about using OpenVDB 8+ when building for C++11, because OpenVDB 8 requires C++14 or higher. #2860 (2.2.12/2.3.3)
      • More gracefully handle building against a custom Imath/OpenEXR even when another exists in the system area. #2876 (2.2.12/2.3.3)
      • Minor fixes to build cleanly against the upcoming Imath 3.0. #2878 (2.2.12/2.3.3)
      • Remove obsolete dependency on Boost random (now use std::random). #2896 (2.3.3)
      • libtiff 4.3 is supported. #2953 (2.3.4)
      • We now include a build_OpenJPEG.bash script that can conveniently build a missing OpenJPEG dependency. (2.3.5/2.2.16)
      • Changes to make it build against TBB 2021. #2985 (2.3.5/2.2.15)
      • Support for building OIIO with gcc 11. #2995 (2.2.16/2.3.6)
      • Fixes to accommodate Imath 3.1 upcoming changes. #2996 (2.2.16/2.3.6)
      • Finding FFMpeg now correctly detects the version. #2994 (2.2.16/2.3.6)
      • FFMpeg minimum version is now >= 3.0. #2999 (2.3.6)
      • Fixes for detecting and using Ptex, among other things got the version wrong. #3001 (2.2.16/2.3.6)
      • Fixes for building against fmt 8.0. #3007 (2.3.6)
      • The OpenCV minimum version is now >= 3.0. #3015 (2.3.6)
      • Fixes to build properly against the upcoming OpenColorIO 2.1. #3050 (2.3.7)
      • All the src/build_scripts/build_*.bash scripts now honor an env variable called DOWNLOAD_ONLY, which if set will only do the downloads but not the builds. #3058 (2.3.7)
    • Testing and Continuous integration (CI) systems:
      • Completely get rid of the old appveyor CI. #2782 (2.3.2.0)
      • Test against libtiff 4.2 in the "latest releases" test. #2792 (2.3.2.0)
      • Got Windows CI fully working, bit by bit. #2796 #2798 #2805 #2821 #2826 #2834 #2835 #2836 #2838 #2839 #2840 (2.3.3)
      • Reduce redundant verbosty in CI output logs during dependency building.
      • Modify hash_test to verify correctness and stability of the hashes. #2853 (2.3.3)
      • When building custom OpenEXR with build_openexr.bash, don't have it build the examples. #2857 (2.2.12/2.3.3)
      • Speed up CI by using GitHub 'cache' actions + ccache. #2859 (2.2.12/2.3.3)
      • Separate stages (setup, deps, build, test) into separate GHA "steps" for better logging and understanding of the timing and performance. #2862 (2.2.12/2.3.3)
      • Now actively testing libheif in Linux CI. #2866 (2.2.12/2.3.3)
      • Remove the last vestiges of Travis-CI, which we no longer use. #2871 (2.2.12/2.3.3)
      • For failed tests, add CMake cache and log part of the saved artifacts. (2.2.12/2.3.3)
      • CI now tests build in C++20 mode. #2891 (2.3.3)
      • Our CI clang-format test now uses LLVM/clang-format 11. #2966
      • Test the clang11 + C++17 combo. #3004 (2.3.6)
    • Platform support:
      • Fixes for mingw. #2698 (2.3.0.0)
      • Windows fix: correct OIIO_API declaration on aligned_malloc, aligned_free of platform.h. #2701 (2.3.0.0)
      • Fix boost linkage problem on Windows. #2727 (2.3.0.1/2.2.8)
      • Fix warnings when compiling webpinput.cpp on 32 bit systems. #2783 (2.3.2.0)
      • Fix problems with copysign sometimes defined as a preprocessor symbol on Windows. #2800 (2.3.2)
      • Fixes related to Mac M1-based systems: Fix crash in ustring internals #2990 (2.3.5/2.2.15.1)

    Notable documentation changes:

    • Make Readthedocs generate downloadable HTML as well as PDF. #2746
    • Explain how to read image data into separate per-channel buffers. #2756 (2.3.0.1/2.2.8)
    • Improve use of breathe and formatting. #2762 (2.3.1.0)
    • Remove documentation of deprecated ImageBufAlgo functions. #2762 (2.3.1.0)
    • Document missing texture option fields. #2762 (2.3.1.0)
    • Starting to use "sphinx_tabs" as a clear way to present how things should be done for different language bindings. #2768 (2.3.1.0)
    Source code(tar.gz)
    Source code(zip)
A simple API wrapper that generates images & facts of any animal

animality.h A simple API wrapper that generates images & facts of any animal Required dependencies: libcurl for sending HTTPS requests. pthreads for t

animality 5 Nov 10, 2022
Like feh, but better, faster, more image formats, simpler, more lightweight, animation support, and better UI

Like feh, but better, faster, more image formats, simpler, more lightweight, animation support, and better UI

martin 11 Oct 23, 2022
An AV1 Image (AVIF) file format plug-in for Adobe® Photoshop®

avif-format An AV1 Image (AVIF) file format plug-in for Adobe® Photoshop®. Single images can be loaded and saved using 8, 10 or 12 bits-per-channel, i

Nicholas Hayes 100 Dec 20, 2022
C++ image processing and machine learning library with using of SIMD: SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX-512, VMX(Altivec) and VSX(Power7), NEON for ARM.

Introduction The Simd Library is a free open source image processing and machine learning library, designed for C and C++ programmers. It provides man

Ihar Yermalayeu 1.7k Jan 5, 2023
CGIF, A fast and lightweight GIF encoder that can create GIF animations and images

CGIF, a GIF encoder written in C A fast and lightweight GIF encoder that can create GIF animations and images. Summary of the main features: user-defi

Daniel Löbl 75 Dec 28, 2022
A crude untested example showing how to retrieve and display images from multiple cameras with OpenCV and wxWidgets.

About wxOpenCVCameras is a crude untested example of how to retrieve and display images from multiple cameras, using OpenCV to grab images from a came

PB 8 Dec 14, 2022
HDRView is a simple research-oriented image viewer with an emphasis on examining and comparing high-dynamic range (HDR) images

HDRView is a simple research-oriented high-dynamic range image viewer with an emphasis on examining and comparing images, and including minimalistic tonemapping capabilities. HDRView currently supports reading EXR, PNG, TGA, BMP, HDR, JPG, GIF, PNM, PFM, and PSD images and writing EXR, HDR, PNG, TGA, PPM, PFM, and BMP images.

Wojciech Jarosz 177 Jan 5, 2023
You can use this to compile the code and output images into a word doc for assignment purposes

Code_n_Ouput_to_docx You can use this to compile the code and output images into a word doc for assignment purposes Basic requirements: Python 3.7 or

Aaditya Prabu K 0 Aug 21, 2022
An open source library for face detection in images. The face detection speed can reach 1000FPS.

libfacedetection This is an open source library for CNN-based face detection in images. The CNN model has been converted to static variables in C sour

Shiqi Yu 11.4k Jan 8, 2023
Convert images to ASCII art.

Image-to-ascii Convert images to ASCII art. This program using stb library to load images. Usage Usage: compile the program to get *.out file

Abdeljalil Bouchfar 13 Aug 20, 2022
Very fast C++ .PNG writer for 24/32bpp images.

fpng Very fast C++ .PNG writer for 24/32bpp images. fpng.cpp was written to see just how fast you can write .PNG's without sacrificing too much compre

Rich Geldreich 639 Dec 25, 2022
Make It Pixel is a programming language to process images to look like pixel art.

Make images look like pixel art Make It Pixel is a programming language to process images to look like pixel art. Its interpreter is written in C++ an

null 21 Nov 24, 2022
Given a set of images, LeastAverageImage generates the least average -- the opposite of the average.

LeastAverageImage Given a set of images, LeastAverageImage generates the least average -- the opposite of the average. More information about the prog

Andrew Eckel 6 Nov 27, 2022
Video++, a C++14 high performance video and image processing library.

Video++ Video++ is a video and image processing library taking advantage of the C++14 standard to ease the writing of fast video and image processing

Matthieu Garrigues 692 Dec 28, 2022
ppl.cv is a high-performance image processing library of openPPL supporting x86 and cuda platforms.

ppl.cv is a high-performance image processing library of openPPL supporting x86 and cuda platforms.

null 366 Dec 30, 2022
The CImg Library is a small and open-source C++ toolkit for image processing

http://cimg.eu The CImg Library is a small and open-source C++ toolkit for image processing, designed with these properties in mind: CImg defines clas

David Tschumperlé 1.2k Jan 3, 2023
The “Quite OK Image” format for fast, lossless image compression

The “Quite OK Image” format for fast, lossless image compression

Dominic Szablewski 6k Dec 30, 2022
QOY - The "Quite OK YCbCr420A" format for fast, lossless image compression

QOY - The "Quite OK YCbCr420A" format for fast, lossless* image compression ( * colorspace conversion to/from RGBA is lossy, if used ) Single-file MIT

Chainfire 19 Oct 1, 2022