Save Image (OIIO)
Save Real EXR Sequences Out of ComfyUI (Your Nuke Comp Will Thank You)
- images
- filename
Core ComfyUI can save a PNG, a JPEG, or a WebP, and that's about it. That's fine for sharing on Discord, but the moment your output needs to survive a Nuke comp, a DaVinci grade, or any pipeline that isn't "post image to Reddit," 8-bit PNG is the wrong tool. Save Image (OIIO) writes OpenEXR - plus TIFF, DPX, TGA, HDR, PSD and a pile more - with real float precision, real compression control, and proper frame numbering. It's the pack's closer, and the reason most people install it.
The tell is in the defaults: filename_prefix is output.exr. This node wants to write EXR frames, and by default it writes them as half (16-bit float) with zip compression. Half is the right call - it has enough dynamic range to survive color grading, at about half the file size of full float (32-bit). If it fits in half, just use it.
How it works
The node takes your batch of IMAGE tensors, converts each to float, pushes it through an OIIO ImageBuf, and writes each frame with ImageOutput. Because it's OpenImageIO underneath, the format is decided by whatever extension you put in filename_prefix - .exr, .dpx, .tiff, whatever. Frames get numbered with zero padding: with default frame_pad: 4 and frame_start: 1, you get output_0001.exr, output_0002.exr… on up. Relative paths land in ComfyUI's output folder; give it an absolute path and it'll create directories as needed.
The inputs that matter
images- the batch to write. A video-length batch becomes a frame sequence.filename_prefix- defaultoutput.exr. The extension picks the format, so this is your format selector.precision-half(default) orfloat. Half unless you specifically need 32-bit range.compression- the OpenEXR codec list:none,zip,zips,piz,pxr24,b44,b44a,dwaa,dwab.zipis the safe default;pizis great for photographic content;dwaa/dwabare the lossy-but-small options and are the only ones that usedwa_compression_level(default 45, range 10–250 - higher = smaller files, more loss).colorspace-autoby default. Withautoit writes your values exactly as they are and tags the file with what's in them. Set it to something likescene_linearand the node converts from sRGB to that space on the way out, tagging the file so Nuke reads it correctly. If you're building an EXR comp, this is the field that pairs with Colorspace Convert (OIIO).frame_start/frame_pad- first frame number and zero-pad width for sequences.
Installing it
ComfyUI Manager: search "comfy-oiio" (or "OpenImageIO"). Manual: cd ComfyUI/custom_nodes && git clone https://github.com/melMass/comfy_oiio, then pip install -r requirements.txt (openimageio plus clique), restart. If Manager's auto-install of requirements fails on the Windows portable build, pip-install into its embedded python: python_embeded\python.exe -m pip install openimageio clique.
Troubleshooting & honest caveats
- It's marked EXPERIMENTAL in the source. It works, but it's early - treat it as "newest release first" territory and keep an eye on the repo.
- EXR won't preview in ComfyUI's browser. The node writes a
output_0001.exr.preview.pngnext to each sequence start so you can sanity-check it, but don't expect thumbnails like core SaveImage. - Workflow metadata isn't embedded in the file. The pack writes prompt/UI info as sidecar JSON files (
_api.json,_ui.json), not into the EXR. Don't expect to drag a saved EXR back into ComfyUI and recover the graph - that PNG-injection trick doesn't carry over to float formats. - If the output looks dark or washed out, check
colorspace- if you forced a conversion, your viewer needs to interpret the file in that same space.autois the safe "just write what you see" mode.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| filename_prefix | STRING | output.exr | — |
| precision | COMBO | half | 2 options: half, float |
| compression | COMBO | zip | 9 options: none, zip, zips, piz, pxr24, b44, +3 |
| colorspace | COMBO | auto | 36 options: auto, scene_linear, lin_srgb, lin_rec709, Rec709, sRGB, +30 |
| frame_start | INT | 10–999999 | — |
| frame_pad | INT | 41–8 | — |
| dwa_compression_level | FLOAT | 45.0010–250 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| filename | STRING | — |