EXR Save
Ship a plate to Nuke or Resolve — EXR with the headroom intact
- images
- alpha
- files
The standard ComfyUI save nodes write pictures. Sometimes you don't want a picture - you want a plate: a file that a compositing program can keep grading, one where a highlight that measured 40 times white is still 40 times white and not a clipped white blob. WAS EXR Save writes that plate. Every image in your batch becomes an OpenEXR file of linear light, numbered in sequence, with values above one kept so the recovered highlights and bright skies you worked so hard for actually survive the trip out of ComfyUI.
Where it sits: at the end of the HDR chain. You decode past white with HDR VAE Decode, or reconstruct a blown highlight with HDR Reconstruct, and the result is linear light with headroom. EXR Save is how you hand that to a grading or compositing program - Nuke, Resolve, After Effects, whatever - at its real brightness instead of flattened to an 8-bit-looking file. If your downstream is a camera raw developer rather than a compositor, DNG Save is the sibling that does the same idea in a raw format.
The inputs that matter
images- the frames to write, read as linear light. Every image in the batch gets its own file, numbered in sequence:ComfyUI_hdrgivesComfyUI_hdr_0001.exr. The prefix can name a subfolder (plates/hdr), and tokens expand, so[time(%Y-%m-%d)]/shotdates the folder.depth-16 bit halfis half the file size, with values to 65504 and about three decimal digits of precision;32 bit floatstores the exact values. Half for delivery, float for a plate that's going to be graded further - this is the knob where people over-engineer. If you're handing off to a compositor for more work, float is the safe call.compression-zipgives smaller files opened by every compositing program;nonestores pixels as they are, same size as the frame. Both keep the exact values - compression here is lossless, unlike a JPEG, so pick zip and stop thinking about it.alpha(optional) - a mask to write as a fourth channel, white opaque / black clear. Leave it unconnected and a four-channel image writes its own alpha while a three-channel one writes colour only. One mask covers a whole batch; a batch of masks is matched frame by frame.
What comes back
The one output is files: the full path of every file written this run, one per line, in batch order - with files that couldn't be written left out of the list, so a partial failure tells you exactly what made it rather than silently pretending.
Installing it
Part of WAS Node Suite v3 - ComfyUI Manager, search WAS Node Suite v3, or clone https://github.com/WASasquatch/was-node-suite-comfyui into custom_nodes. The EXR writer is built into the pack on torch; no OpenEXR pip package to install, no model weights to fetch. This is one of those pleasant v3 changes: the old suite leaned on heavyweight image libraries, and the rewrite made EXR read/write a first-class citizen with zero dependencies.
One habit that saves grief later: verify the round trip once. Save a frame with EXR Save, pull it back in with EXR Load and check the peak output matches what you started with. If it does - and it will - you can trust the whole chain, and the next time someone sends you an EXR that "lost its highlights," you'll know the file format wasn't the one that flattened it.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | The images to write, read as linear light. Every image in the batch gets its own file, each with the next number in the sequence. | |
| filename_prefix | STRING | ComfyUI_hdr | Name and folder under the output directory, before the number. `ComfyUI_hdr` gives `ComfyUI_hdr_0001.exr`; `plates/hdr` puts it in that subfolder. Tokens expand, so `[time(%Y-%m-%d)]/shot` dates the folder. |
| depth | COMBO | '16 bit half' = half the file size, values to 65504 and about three decimal digits; '32 bit float' = the exact values on the wire. Half for delivery, float for a plate that gets graded further. | |
| compression | COMBO | zip | 'zip' = smaller files, opened by every compositing program; 'none' = the pixels stored as they are, which every reader takes and which stays the frame size on disk. Both keep the exact values. |
| alphaopt | MASK | Coverage to write as a fourth channel, white opaque and black clear. Left unconnected, a four channel image writes its own alpha and a three channel one writes colour only. One mask covers a whole batch; a batch of masks is matched frame by frame. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| files | STRING | Full path of every file written this run, one per line, in batch order. A file that could not be written is left out of the list. |