Skip to content

cheind/py-minexr

Repository files navigation

example workflow

minexr

minexr is a standalone, fast Python OpenEXR reader for single-part, uncompressed scan-line files. It is compatible with .exr files produced by Blender.

Assumptions

minexr makes a couple of assumptions about the .exr file to be read:

  1. single-part files with arbitrary number of channels,
  2. no pixel data compression, and
  3. 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.

Usage

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.

Runtime

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

Install

Either via pip

pip install minexr

Or clone this repository and invoke

pip install -e .

Tests

To run the tests

pytest

Blender support

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.

When unsure about which channels are being written, you can inspect the file content as follows
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.

About

Minimal, standalone, fast Python OpenEXR reader for single-part, uncompressed scan-line files as produced by Blender.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages