ComfyUI Node

SaveImageOpenEXR

Save full float-precision depth for VFX and 3D tools

By kijai·Created 3 years ago·Updated about a year ago· 570
SaveImageOpenEXR
  • images
  • file_url
filename_prefixComfyUI_EXR

A standard PNG stores 8 bits per channel - 256 possible brightness values. A depth map that spans a real scene's full distance range, quantized down to 256 steps, loses precision you often don't notice until you try to actually use it: a 3D tool building a mesh from a banded 8-bit height field gets visible stepping instead of a smooth surface. OpenEXR is the industry format VFX and 3D pipelines use specifically to avoid this - 32-bit float per channel, effectively no meaningful quantization for this kind of data. This node exists so the pack's depth output can leave ComfyUI in that format instead of getting flattened to PNG on the way out.

Why the pack bothers with this

Straight from the README, in the same breath as the remap node: it adds an "OpenEXR node to save the full range, works wonders compared to default png when used in VFX/3D modeling software." That's a specific, credible claim from someone who clearly uses this for actual 3D work, not a generic feature checkbox - if you're feeding a Marigold depth map into Blender as a displacement/height map, a 3D printing pipeline, or any compositing tool that expects float EXR input, this is the node that gets your data there intact.

The inputs and outputs that matter

Only two inputs, and this is a save/output node so there's no image passed further downstream in ComfyUI:

  • images (IMAGE) - the depth map (or any image) you want saved. Feed it your Marigold output directly - you generally want the unmodified map here, not a colorized or aggressively remapped version, since the whole point is preserving the real float values.
  • filename_prefix (default ComfyUI_EXR) - same idea as the built-in SaveImage node, just a naming prefix for the files that land in your output folder.

One output: file_url (STRING) - a URL/path pointing at the saved file, useful if you want to chain something after the save (logging it, passing it to another step that needs the path). This node is also marked as an output node in ComfyUI's graph, meaning it's a terminal point that gets executed even without anything consuming its output.

How to install it

Same pack, no separate steps. ComfyUI Manager: search "marigold", install, restart. Manual:

cd ComfyUI/custom_nodes
git clone https://github.com/kijai/ComfyUI-Marigold
pip install -r ComfyUI-Marigold/requirements.txt

OpenEXR support needs a real library under the hood (typically OpenEXR/Imath bindings), which the pack's requirements.txt pulls in - if you skip that install step and try to run this node standalone after cloning manually, this is the node most likely to break on you.

Common issues & troubleshooting

The node errors out about a missing OpenEXR module. This is almost always a skipped or partial pip install -r requirements.txt - OpenEXR bindings aren't part of a base ComfyUI environment, and this node is the only one in the pack that actually needs them. Reinstall the pack's requirements inside your real ComfyUI venv.

The saved EXR looks wrong or all-black when opened in a normal image viewer. Most everyday image viewers don't tone-map float EXR data properly by default - this is a viewer problem, not a save problem. Open it in something that actually understands float EXR (Blender, Nuke, DJV, or a proper VFX-aware viewer) rather than judging it in a standard OS image preview.

File size is much bigger than the PNGs you're used to. That's expected and is the whole tradeoff - 32-bit float per channel versus 8-bit means several times the data per pixel. If disk space is tight and you don't actually need float precision downstream, SaveImage's regular PNG output is the better fit; save this node's output for when a 3D or compositing tool downstream genuinely reads the extra precision.

You fed it a colorized or remapped image and the "depth" data in the EXR looks wrong. This node saves exactly what you give it - if you routed a ColorizeDepthmap output here instead of the raw map, you've saved a pretty picture, not usable depth data. Feed it the unmodified depth output.

CategoryMarigold

Inputs (2)

NameTypeDefaultDescription
imagesIMAGE
filename_prefixSTRINGComfyUI_EXR

Outputs (1)

NameTypeDescription
file_urlSTRING