minexr is a standalone, fast Python OpenEXR reader for single-part, uncompressed scan-line files. It is compatible with .exr
files produced by Blender.
minexr makes a couple of assumptions about the .exr
file to be read:
- single-part files with arbitrary number of channels,
- no pixel data compression, and
- equal channel types (HALF, FLOAT, UINT).
These assumptions allow us to efficiently parse and read the .exr
file. In particular we gain constant offsets between scan lines which allows us to read the entire image in (H,C,W) format without copying.
The following is taken from example.py
import minexr
with open('file.exr', 'rb') as fp:
reader = minexr.load(fp)
rgba = reader.select(['Color.R','Color.G','Color.B','Color.A'])
# a HxWx4 np.array with dtype based on exr type.
...
Full example.py loads the following images
which were previously rendered using Blender/EEVEE cube.blend.
The following timings are produced by bench.py by repeatable reading an RGBA image from an .exr
file. Timings include file and numpy operations.
Module | [sec/image] | Note |
---|---|---|
OpenEXR 1.3.2 | 0.020 | with channel concatenate |
OpenEXR 1.3.2 | 0.015 | without channel concatenate |
minexr | 0.004 | with channel concatenate |
Either via pip
pip install minexr
Or clone this repository and invoke
pip install -e .
To run the tests
pytest
Use a FileOutput
node in Blender's compositor to export .exr
files. Make sure to select OpenEXR MultiLayer
format and set CODEC
to None as shown in the following image. Color Depth
can be chosen as required.
import minexr
with open('file.exr', 'rb') as fp:
reader = minexr.load(fp)
print(reader.channel_names)
# ['Color.R','Color.G','Color.B', ...]
print(reader.attrs)
# Dictionary of all OpenEXR header attributes.