Library / SDK
AcademySoftwareFoundation/OpenImageIO avatar
AcademySoftwareFoundation/OpenImageIO

OpenImageIO: a format-agnostic image I/O library for VFX pipelines

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

2,372 stars709 forksC++Apache-2.0

At a glance

What is it?
OpenImageIO gives renderers, compositors and viewers one API for reading and writing dozens of image formats. It is a production library, not a quick script, and its build is the part that decides whether it fits.
Who is it for?
Adopt OpenImageIO if you are building a renderer, compositor, viewer or pipeline tool that must read formats it was not compiled to know about, and you can absorb a CMake build with a long dependency list. Do not adopt it if you need a single-format reader, a browser-side decoder, or something you can vendor as one header.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly C++, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 30, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The problem OIIO solves for VFX pipelines

A renderer or compositor has to open whatever the artist hands it. That might be an EXR from the lighting department, a DPX from a scanner, a Photoshop PSD, a Cineon frame, a camera RAW file, or a QuickTime movie read frame by frame. Writing a decoder for each one inside each tool is duplicated work, and it means every tool has a different, slightly wrong idea of what a valid file looks like. OpenImageIO's answer is a single abstraction: ImageInput and ImageOutput, with each format implemented as a plugin. The calling application does not need to know the details of the file formats, and according to the README, it does not even need to be aware of which formats are available. The audience named in the mission statement is VFX studios and the developers of tools such as renderers, compositors and viewers. If you are writing a one-off script that converts PNG to JPEG, this is a much heavier instrument than the job needs.

How the plugin architecture and ImageCache actually work

The library manages subclasses of ImageInput and ImageOutput, and each file format's implementation lives in a plugin that is found at runtime. That is the mechanism that makes the format list open-ended: an application built against OpenImageIO can read any format for which a plugin can be found, without being rebuilt. The README lists TIFF, JPEG/JFIF, JPEG XL, OpenEXR, PNG, HDR/RGBE, ICO, BMP, Targa, JPEG-2000, RMan Zfile, FITS, DDS, Softimage PIC, PNM, DPX, Cineon, IFF, OpenVDB, Ptex, Photoshop PSD, Wavefront RLA, SGI, WebP, GIF, DICOM, HEIF/HEIC/AVIF, many RAW camera formats, and a variety of movie formats readable as individual frames.

The second mechanism is ImageCache, which the README describes as transparently managing a cache so that very large image sets (tens of thousands of files, multiple TB) can be accessed using only tens of megabytes of runtime memory. TextureSystem sits on top of ImageCache and provides filtered MIP-map texture lookups; the README states it is used in commercial renderers and has been used on many large VFX and animated films. ImageBuf and ImageBufAlgo are the in-memory layer: a class for holding a whole image and a collection of operations over it. The design trade-off is real. A runtime plugin lookup and a cache layer add indirection compared with linking a single decoder directly, and the cache only pays for itself when the working set is larger than memory.

Installing OpenImageIO and running a first conversion

The repository has a pyproject.toml, and its [project] table names the package OpenImageIO, requires Python >= 3.9, and declares a single runtime dependency: numpy>=2.0,<3. So the Python route is a normal install:

bash
pip install OpenImageIO

After that, the command line tools should be on your PATH. The pyproject.toml [project.scripts] table exposes CLI tools as Python scripts, and the entries visible in the file include idiff and maketx. The README names the full set of tools: oiiotool for command-line format conversion and image processing, iinfo for printing detailed info about images, iconvert for converting among formats, data types, or modifying metadata, idiff for comparing images, igrep for searching images for matching metadata, and iv, an image viewer. Because these tools are built on ImageInput and ImageOutput, they work with any format for which plugins are available. A first useful command is to inspect a file before converting it:

bash
iinfo

Run iinfo with no arguments and it prints its usage, which is the quickest way to confirm the tool is installed and to see which flags the build supports. Conversion is then a single call, with the output format inferred from the extension:

bash
oiiotool

Run oiiotool with no arguments and it prints its usage, listing the operations available in that build. For a C++ build, the README points at INSTALL.md for build and installation instructions and describes that document as one that "could use some work, particularly for Windows." The top-level Makefile is a wrapper around CMake, so the documented entry point is `make`, with variables such as `CMAKE_BUILD_TYPE`, `USE_PYTHON` and `PYTHON_VERSION` passed through to CMake. The repository also carries a conanfile.txt, so Conan is a supported consumption route.

Where OpenImageIO is the wrong tool

The build is the first limitation, and the project says so itself: INSTALL.md is linked from the README with the note that it could use some work, particularly for Windows. That is an unusually direct admission, and it matches the shape of the project. A library that wraps this many formats inherits a long list of third-party dependencies, and the plugin list includes formats such as OpenVDB, Ptex and DICOM that most users will never touch but that still have to be resolved or explicitly disabled at configure time.

The second limitation is the Python package. The pyproject.toml is configured for cibuildwheel, which means the wheels are built per platform and per Python version, and the declared support runs from Python 3.9 through 3.14. The README does not document a pure-Python fallback, and nothing in the repository suggests the package works without the compiled library underneath. If your target is a platform with no wheel, pip install is not the end of the story.

The third case is scope. OpenImageIO is aimed at VFX and animation production. If you are decoding one format on a web server, or you need a decoder that runs in a browser, this library is on the wrong side of that boundary. It is also not a colour management system: the README describes reading, writing and manipulating image files, and mentions metadata modification through iconvert, but it does not present itself as the component that decides what a pixel value means.

OpenImageIO compared with a single-format library

The obvious alternative is to link a dedicated library for the one format you actually need, such as OpenEXR for EXR or libtiff for TIFF. The difference is not quality, it is where the format knowledge lives. With a dedicated library, the format is a compile-time decision: your build knows exactly which decoder it contains, the dependency graph is small, and there is no runtime lookup to fail. With OpenImageIO, the format set is a runtime property, which is what lets a single renderer binary open a file type that did not exist when the renderer was compiled. That flexibility is the entire point, and it is also the cost: you now depend on plugins being present and discoverable on the machine that runs the tool.

The second alternative is to keep the format-specific libraries and add your own thin dispatch layer. That is essentially reimplementing the ImageInput abstraction, and it is the work OpenImageIO already did, including the ImageCache memory behaviour that is hard to get right. The honest comparison is that a dedicated library wins on dependency count and build time for single-format work, and OpenImageIO wins as soon as a second format, a third, or a plugin that ships after your binary does, enters the picture.

Licence, governance and what upgrading costs

Original code is under Apache-2.0 and documentation is under Creative Commons Attribution 4.0 Unported. The README states that in 2023 historical users were asked to relicense from the original BSD-3-clause to Apache-2.0, and that over 99.86% of lines of code have been relicensed. A small amount of code incorporated from other projects is covered by compatible third-party licences listed in THIRD-PARTY.md. For anyone auditing a dependency, that THIRD-PARTY.md file is the one to read, and the RELICENSING.md file explains the history. This is a description of what the repository states, not legal advice.

Governance sits with the Academy Software Foundation, part of the Linux Foundation, formed in collaboration with the Academy of Motion Picture Arts and Sciences. The technical charter and GOVERNANCE.md describe how decisions are made. There is a CODE_OF_CONDUCT.md and a SECURITY.md, and the README asks that serious vulnerabilities be filed as a GitHub security advisory rather than discussed publicly. On upgrade cost, the releases page and CHANGES.md are the record; the project publishes both stable and beta tags, with v3.1.17.0 released on 2026-09-01 and v3.2.0.4-beta2 on 2026-09-16, so a team pinning versions has a clear stable line to follow. The last push to the default branch was on 2026-09-28.

Editorial conclusion

Adopt OpenImageIO if you are building a renderer, compositor, viewer or pipeline tool that must read formats it was not compiled to know about, and you can absorb a CMake build with a long dependency list. Do not adopt it if you need a single-format reader, a browser-side decoder, or something you can vendor as one header. Before committing, verify what a pip install actually pulls in on your platform, check whether the plugin set you need is compiled into libOpenImageIO or shipped as separate plugin files, and confirm the release you pin against the CHANGES.md entry for that version.

Frequently asked questions

How do I install OpenImageIO?

The repository ships a pyproject.toml with the package name OpenImageIO, so the Python route is pip install OpenImageIO. For a C++ build, the README points at INSTALL.md, and the top-level Makefile wraps CMake, so make with variables such as CMAKE_BUILD_TYPE and USE_PYTHON is the documented entry point.

How do I use OpenImageIO?

The README describes ImageInput and ImageOutput as the core abstraction, with ImageBuf and ImageBufAlgo for in-memory work, plus command line tools built on the same classes. The documented quick start is docs/QuickStart.md, which gives an example in Python, C++ and on the command line.

Which image formats does OpenImageIO read and write?

The README lists TIFF, JPEG/JFIF, JPEG XL, OpenEXR, PNG, HDR/RGBE, ICO, BMP, Targa, JPEG-2000, RMan Zfile, FITS, DDS, Softimage PIC, PNM, DPX, Cineon, IFF, OpenVDB, Ptex, Photoshop PSD, Wavefront RLA, SGI, WebP, GIF, DICOM, HEIF/HEIC/AVIF, many RAW camera formats, and several movie formats readable as individual frames.

Does OpenImageIO have Python bindings?

Yes. The README states there are Python bindings for all of the major APIs, and the pyproject.toml declares requires-python >= 3.9 with classifiers through Python 3.14. The only declared runtime dependency is numpy>=2.0,<3.

What command line tools does OpenImageIO provide?

The README names oiiotool for format conversion and image processing, iinfo for printing detailed image information, iconvert for converting formats, data types or metadata, idiff for comparing images, igrep for searching image metadata, and iv, an image viewer.

Official sources

  1. AcademySoftwareFoundation/OpenImageIO on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/academysoftwarefoundation-openimageio.svg)](https://hysenlabs.com/projects/academysoftwarefoundation-openimageio)