OpenEXR provides the specification and reference implementation of the EXR file format, the professional-grade image storage format of the motion picture industry.
The purpose of EXR format is to accurately and efficiently represent high-dynamic-range scene-linear image data and associated metadata, with strong support for multi-part, multi-channel use cases.
OpenEXR is widely used in host application software where accuracy is critical, such as photorealistic rendering, texture access, image compositing, deep compositing, and DI.
The goal of the OpenEXR project is to keep the EXR format reliable and modern and to maintain its place as the preferred image format for entertainment content creation.
Major revisions are infrequent, and new features will be carefully weighed against increased complexity. The principal priorities of the project are:
- Robustness, reliability, security
- Backwards compatibility, data longevity
- Performance - read/write/compression/decompression time
- Simplicity, ease of use, maintainability
- Wide adoption, multi-platform support - Linux, Windows, macOS, and others
OpenEXR is intended solely for 2D data. It is not appropriate for storage of volumetric data, cached or lit 3D scenes, or more complex 3D data such as light fields.
The goals of the Imath project are simplicity, ease of use, correctness and verifiability, and breadth of adoption. Imath is not intended to be a comprehensive linear algebra or numerical analysis package.
OpenEXR is a project of the Academy Software Foundation. See the project's governance policies, contribution guidelines, and code of conduct for more information.
See the technical documentation for
complete details, but to get started, the "hello, world" .exr
writer program is:
#include <ImfRgbaFile.h>
#include <ImfArray.h>
#include <iostream>
int
main()
{
try {
int width = 10;
int height = 10;
Imf::Array2D<Imf::Rgba> pixels(width, height);
for (int y=0; y<height; y++)
for (int x=0; x<width; x++)
pixels[y][x] = Imf::Rgba(0, x / (width-1.0f), y / (height-1.0f));
Imf::RgbaOutputFile file ("hello.exr", width, height, Imf::WRITE_RGBA);
file.setFrameBuffer (&pixels[0][0], 1, width);
file.writePixels (height);
} catch (const std::exception &e) {
std::cerr << "Unable to read image file hello.exr:" << e.what() << std::endl;
return 1;
}
return 0;
}
The CMakeLists.txt
to build:
cmake_minimum_required(VERSION 3.10)
project(exrwriter)
find_package(OpenEXR REQUIRED)
add_executable(${PROJECT_NAME} writer.cpp)
target_link_libraries(${PROJECT_NAME} OpenEXR::OpenEXR)
To build:
$ mkdir _build
$ cmake -S . -B _build
$ make --build _build
For more details, see The OpenEXR API.
-
Ask a question:
-
Email: openexr-dev@lists.aswf.io
-
Slack: academysoftwarefdn#openexr
-
-
Attend a meeting:
-
Technical Steering Committee meetings are open to the public, fortnightly on Thursdays, 1:30pm Pacific Time.
-
-
Report a bug:
- Submit an Issue: https://github.com/AcademySoftwareFoundation/openexr/issues
-
Report a security vulnerability:
- Email to security@openexr.com
-
Contribute a Fix, Feature, or Improvement:
-
Read the Contribution Guidelines and Code of Conduct
-
Sign the Contributor License Agreement
-
Submit a Pull Request: https://github.com/AcademySoftwareFoundation/openexr/pulls
-
- Website: http://www.openexr.com
- Technical documentation: https://openexr.readthedocs.io
- Porting help: OpenEXR/Imath Version 2.x to 3.x Porting Guide
- Reference images: https://github.com/AcademySoftwareFoundation/openexr-images
- Security policy: SECURITY.md
- Release notes: CHANGES.md
- Contributors: CONTRIBUTORS.md
OpenEXR is licensed under the BSD-3-Clause license.