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
  • Build/security: Try FORTIFY_SOURCE

    Build/security: Try FORTIFY_SOURCE

    Add a new build-time cmake cache variable: FORTIFY_SOURCE

    Default to empty, but can be set to 1, 2, or 3, corresponding to setting the _FORTIFY_SOURCE macro available in recent versions of clang and gcc. (I'm not sure exactly which minimum compiler version is needed for each fortification level, except that for level 3, gcc must be 12+.)

    Fortification involves replacing several "unsafe" memory-related functions such as memcpy, memset, strcpy, etc, with special versions that do bounds checking, aided by some compiler smarts for understanding the likely bounds of different buffers. If I understand correctly, at level 2 it can figure out bounds of constant-sized arrays, and at level 3 it can figure out certain dynamic cases as well.

    There are two use cases for this:

    1. For our own CI, this is yet another bit of static and dynamic anslysis to enable (currently, just in the gcc12 test) to possibly catch bugs.

    2. Users who are building OIIO to deploy it in security-sensitive environment may wish to build with some fortification level enabled to help prevent certain memory errors or security issues, understanding that it may slightly impact performance.

    opened by lgritz 0
  • [FEATURE REQUEST] rawinput: keep orientation metadata if automatic image rotation is disabled

    [FEATURE REQUEST] rawinput: keep orientation metadata if automatic image rotation is disabled

    Is your feature request related to a problem? Please describe.

    An option has been added to disable the automatic rotation of the image buffer for RAW images by libraw using "raw:user_flip". https://github.com/OpenImageIO/oiio/pull/2769 The problem is that at the end of the raw reader, OIIO overrides the orientation metadata to no-rotation in all case, here: https://github.com/OpenImageIO/oiio/blame/master/src/raw.imageio/rawinput.cpp#L943 So this is fine when libraw is doing the automatic rotation of the buffer, but it would be good to keep the orientation information when we disable the libraw auto-rotation.

    Describe the solution you'd like Check the "raw:user_flip" to only override the orientation metadata if libraw is doing the auto-rotation of the image buffer.

    Describe alternatives you've considered No idea.

    Additional context I'm facing the problem in this context: https://github.com/alicevision/AliceVision/pull/1045/files I need to keep buffers in the same orientation to be able to reuse the same buffers on gpu from multiple images. If the images are rotated, I get a mix of various image resolutions for the same camera and it increases memory usage.

    opened by fabiencastan 0
  • DDS: various improvements

    DDS: various improvements

    Description

    • If a DDS pixel format header contains "this is a normal map" flag set, then handle that properly (#3525):
      • For a DXT5, this means it's a "DXT5nm" format. Normal X & Y components are in green and alpha channel respectively. Compute Z component from those, and the result is a 3-channel tangent space normal map.
      • For ATI2/BC5 format that also has a "normal map" flag set, compute the Z component automatically too, and result is a 3-channel image. However a bunch of ATI2/BC5 normal maps out there in the wild do not have that bit set, so also have a global "dds:bc5normal" attribute to optionally turn this on.
    • Fix support of R10G10B10A2 format - was producing garbage data due to code assumption that truncation down to 8 bits never needs to happen.
    • Fix bit expansion ("too dark") of very low-bit formats, e.g. R3G3B2. Code was simply shifting the bits, instead of properly repeating the high bits into new low bit positions (i.e. a 3-bit "111" needs to become an 8-bit "11111111" and not a "11100000").
    • Support "RXGB" (DXT5, with red & alpha swapped) as well as "BC4U" and "BC5U" formats (the latter two are just BC4 and BC5, produced by some older tools).
    • Support alpha-only (e.g. A8) formats.

    All this mostly prompted by doing DDS improvements in Blender, and wanting to get Cycles renderer (which uses OIIO) to the same feature parity. See https://developer.blender.org/T101405 and https://developer.blender.org/D16087.

    Tests

    ⚠️ Not yet! I should probably add a bunch of new images to oiio-images test suite, but first wanted to check if these suggested improvements even make sense.

    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.
    • [ ] 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 aras-p 0
  • ustring improvements: ustringHasher and ustring ctr from ustringhash

    ustring improvements: ustringHasher and ustring ctr from ustringhash

    I realized that the ustringhash class (recently added) is confusingly similr to the hashing functor ustringHash (been there so long I'd forgotten about it). To clear this up, make ustringHasher for clarty. Get on a path of eventually deprecating and removing ustringHash.

    I also noticed that there's no directly ustringhash -> ustring conversion. Add it.

    opened by lgritz 0
  • [HELP] Deploying an app with OpenImageIO on macOS

    [HELP] Deploying an app with OpenImageIO on macOS

    Hey guys,

    I am wondering if you have some hints how to properly deploy the application using OpenImageIO on macOS? When I build the library myself from the sources, cmake grabs a bunch of dependencies from my brew installation and I end up having a mix of dependencies that have fixed dependency paths into /opt/homebrew/lib/.

    Am I facing manual scripting with install_name_tool to re-write all the dylib deps? Or is there a better way to do it?

    opened by timeinpixels 0
  • [BUG] Radiance HDR files aren't loadable with an ioproxy

    [BUG] Radiance HDR files aren't loadable with an ioproxy

    Describe the bug Trying to load a .hdr file with an in-memory ioproxy seems to fail.

    To Reproduce Steps to reproduce the behavior:

      Filesystem::IOMemReader memreader((void *)mem, size);
      auto in = ImageInput::open("mem", nullptr, &memreader);
      if (!in) {
        fprintf(stderr, "BAD: %s\n", OIIO::geterror().c_str());
        return nullptr;
      }
    

    Expected behavior The code itself seems to work for .bmp, .png, .tga, .tif, and .jpg so generally things seem ok. Additionally, the .hdr file is valid:

    .\iinfo.exe T:\test.hdr                                                                                                                                                                                      
    T:\test.hdr : 1024 x 1024, 3 channel, float hdr
    

    Evidence It's like the ioproxy is skipped and a fallback using the filename occurs: BAD: Image "mem" does not exist. Also, it is not the name of an image format that OpenImageIO recognizes.

    Platform information:

    • OIIO branch/version: 2.4.3 beta
    • OS: Windows 10
    • C++ compiler: MSVC 2022
    opened by jessey-git 1
Releases(v2.4.4.0-RC2)
  • 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)
  • v2.2.17.0(Aug 2, 2021)

    Release 2.2.17 (1 Aug 2021) -- compared to 2.2.16

    • Output to DPX files now supports IOProxy. (Input already did.) #3013
    • typedesc.h: 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
    • Build: Fixes for building against fmt 8.0.0. #3007
    • Build: Finding boost is more flexible when desiring static libraries. #3031
    Source code(tar.gz)
    Source code(zip)
  • v2.2.16.0(Jul 1, 2021)

    Release 2.2.16 (1 Jul 2021) -- compared to 2.2.15

    • 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)
    • When doing color space transforms on images with > 4 channels -- the additional channels are now copied unaltered, rather than leaving them black. #2987 (2.2.16)
    • FFMpeg: fix some encodings that didn't correctly recognize that they were more than 8 bits, or had alpha. #2989 (2.2.16)
    • 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)
    • Fix crashes on M1 (ARM) based Mac. #2990 (2.2.16)
    • Bug fix: avoid divide-by-0 error computing chunk size for invalid image sizes. #2983 (2.2.16)
    • make_texture (and maketx and oiiotool -otex) no longer crash if you try to make a texture out of a "deep" image; instead it will return an error message. #2991 (2.2.16)
    • filesystem.h: Improve exception safety in Filesystem directory iteration. #2998 (2.2.16)
    • Build: Improve finding of OpenJPEG. #2979 (2.2.16)
    • Build: Support for building OIIO with gcc 11. #2995 (2.2.16)
    • Build: Fixes to accommodate Imath 3.1 upcoming changes. #2996 (2.2.16)
    • Build: Finding FFMpeg now correctly detects the version. #2994 (2.2.16)
    • Build: clang + C++17 + LibRaw < 0.20 are mutually incompatible. Detect this combination and warn / disable libraw under those conditions. #3003 (2.2.16)
    • Build: Fix CMake behavior for REQUIRED_DEPS due to a typo. #3011 (2.2.16)
    • Build: Fixes for detecting and using Ptex, among other things got the version wrong. #3001 (2.2.16)
    • Testing: If a feature is disabled, skip its tests rather than reporting them as broken. #2988 (2.2.16)
    • CI: Test the combination of clang and C++17. #3003 (2.2.16)
    Source code(tar.gz)
    Source code(zip)
  • v2.2.15.1(Jun 3, 2021)

  • v2.2.15.0(Jun 1, 2021)

    Release 2.2.15 (1 Jun 2021) -- compared to 2.2.14

    • BMP improvements: now support reading rle-compressed BMP files; writing single channel grayscale images now save as 8bpp palette images intead of 24bpp; and reading 8bpp where all palette entries have R==G==B looks like a 1-channel grayscale instead of 3-channel RGB. #2976
    • Bug: IBA::render_text did not properly account for alpha of the draw color. #2981
    • Bug: Fix runaway parsing time for pathological XMP metadata. #2968
    • Bug: Fixed a crash is ImageCacheFile::read_unmipped when sampling
    • Fix exported cmake config files, which could fail if Imath and OpenEXR weren't the at the same version number. #2975
    • Build: Modernize cmake to use targets for PNG and ZLIB. #2957
    • Build: Fix to accommodate upcoming OpenColorIO 2.1 deprecation of parseColorSpaceFromString. #2961
    • Build: Changes to make it build against TBB 2021. #2985
    • Dev: Add Strutil functions: find, rfind, ifind, irfind. #2960 non-zero-base channels. (#2962)
    Source code(tar.gz)
    Source code(zip)
  • v2.2.14.0(May 1, 2021)

    Release 2.2.14 (1 May 2021) -- compared to 2.2.13

    • JPEG: Improve reading of files with mildly corrupted headers. #2927
    • TIFF: Support IOProxy for input. #2921
    • BMP: Improve performance by eliminating wasteful per-scanline allocation and needless data copying. #2934
    • Build/CI: Fix all the build_*.bash scripts to not use cmake --config flag, which was harmlessly ignored but is flagged as an error for CMake 3.20. #2931
    • Build: More fixes related to supporting a wide range of OpenEXR versions, and making our exported cmake configs correctly transmit dependencies on OpenEXR include paths. #2935 #2941 #2942 #2947
    • ImageBufAlgo::fillholes_pushpull: added logic to correctly set the spec's alpha_channel field when generating sub-images. #2939
    • Python: MakeTxBumpWithSlopes enum value had been inadvertently omitted from the Python bindings. #2951
    Source code(tar.gz)
    Source code(zip)
  • v2.2.13.1(Apr 7, 2021)

    Release 2.2.13.1 (7 Apr 2021) -- compared to 2.2.13.0

    (Build related fixes only)

    • Fix build break when using gcc 10 (and some other modern gcc versions) but using C++11 compilation mode. #2930
    • CMake: don't use --config inappropriately (CMake 3.20 was broken for several of our helper build scripts for building dependencies). #2931
    • Be robust to OpenEXR 2.x installations where IlmBase and OpenEXR had separate sets of config files in different subdirectories. #2935
    Source code(tar.gz)
    Source code(zip)
  • v2.2.13.0(Apr 1, 2021)

    Release 2.2.13 (1 Apr 2021) -- compared to 2.2.12

    • Get ready for upcoming Imath/OpenEXR 3.0 release. #2883 #2894 #2897
    • GIF: Fix error checking for non-existant GIF files. #2886
    • Fix crash related to ImageBuf:set_write_format() when used in conjunction with a file format that doesn't support per-channel data types. #2885
    • Make RAW files handle Unicode filenames on Windows. #2888
    • Make sure OIIO builds cleanly with C++20. #2891
    • BMP: Several bug fixes when reading an older (V1) variety of BMP files. #2899
    • Targa: fix reading tga files with 0-sized thumbnails. #2903
    • TIFF: fix reading of certain tiled TIFF files with the vertical image size is not a whole multiple of the tile size. #2895
    • Avoid OpenColorIO v2 exception when color-conversion of single points (we didn't pass a correct stride, thinking that stride isn't used for a single point). #2911
    • make_texture: When outputting to a 'half' data format file, clamp filtered values to the half range so large values don't inadvertently get converted to half 'infinite' values. #2892
    • Improvements to ustring internals to ensure that no two ustrings ever end up with the same hash() value. #2870
    • Fixes for compiler errors when compiling farmhash.h using C++11 mode with newer gcc (6+). #2914
    Source code(tar.gz)
    Source code(zip)
  • v2.2.12.0(Mar 1, 2021)

    Release 2.2.12 (1 Mar 2021) -- compared to 2.2.11

    • Bug fix: 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
    • Bug fix: Fix loading PSB files with cinf tags. #2877
    • Build: Improvements to building or linking static libraries. #2854
    • Build: 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
    • Build: More clear warnings about using OpenVDB 8+ when building for C++11, because OpenVDB 8 requires C++14 or higher. #2860
    • Build: The pkgconfig OpenImageIO.pc was specifying the include path incorrectly. #2869
    • Build: More gracefully handle building against a custom Imath/OpenEXR even when another exists in the system area. #2876
    • Build: Minor fixes to build cleanly against the upcoming Imath 3.0. #2878
    • Dev: hash.h: Make many of the hash functions constexpr. #2843
    • Dev: Better unit tests to verify correctness and stability over time of the hash functions. #2853
    • Dev: unordered_map_concurrent.h: New methods find_or_insert, nobin_mask(). #2867
    • CI: Speed up CI builds by not building OpenEXR example programes. #2857
    • CI: Speed up CI by using GitHub 'cache' actions + ccache. #2859
    • CI: Separate stages (setup, deps, build, test) into separate GHA "steps" for better logging and understanding of the timing and performance. #2862
    • CI: Now actively testing libheif in Linux CI. #2866
    • CI: Remove the last vestiges of Travis-CI, which we no longer use. #2871
    • CI: For failed tests, add CMake cache and log part of the saved artifacts.
    • PSA: Avoid libheif 1.10 on Mac, it is broken. Libheif 1.11 is fine.
    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 Jun 23, 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 Aug 18, 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 79 Sep 22, 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.6k Sep 30, 2022
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 68 Aug 11, 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 6 Jul 13, 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 120 Sep 14, 2022
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.2k Oct 4, 2022
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 614 Sep 26, 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 16 Sep 7, 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 5 Apr 12, 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 686 Sep 23, 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 347 Sep 27, 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 Oct 1, 2022
The “Quite OK Image” format for fast, lossless image compression

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

Dominic Szablewski 5.8k Sep 26, 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