ComfyUI Node

Nuke Write

Save EXR sequences without leaving the graph

By sumitchatterjee13·Created about a year ago·Updated 9 days ago· 59
Nuke Write
  • image
  • passes
  • image
  • file_paths
file_path
frame_start1
channelsrgba
file_typeexr
bit_depth16f
compressiondwaa
frame_padding4
overwritefalse
create_directoriestrue
colorspaceraw
show_previewtrue

ComfyUI's Save Image writes a PNG and calls it a day. NukeWrite is the node you switch to when a PNG isn't the deliverable: it writes EXR, TIFF, DPX, HDR, TGA, BMP, even webp, with real bit-depth and compression control, and it can write image sequences with frame padding. It's the natural end of a Nuke-style pipeline - Read in, grade, write back out in a format the rest of your post chain actually wants.

You reach for it whenever the output has to survive contact with another tool. A render for a compositor needs 16-bit or 32-bit EXR, not 8-bit PNG. A contact sheet needs DPX. A sequence for video work needs %04d padding so the next app sees frames, not one file. NukeWrite does all of that, and its all_channels mode goes further - it can write an entire multi-pass EXR from a NUKE_PASSES bundle, the thing the pack's NukeReadMultiPass produces.

How it works

Writes go through OpenImageIO when available, falling back to OpenCV/PIL. Relative paths land in ComfyUI's output directory, subdirectories get created automatically, absolute paths are used as-is. file_path supports %04d and #### patterns; frame_padding (default 4) sets how many digits frames get. When there's no pattern at all, auto_sequence (default on) appends an incrementing number so test1.png, test2.png... never overwrite - turn it off and it clobbers the same file every run.

The channels dropdown is the interesting part. rgba and rgb write the IMAGE input normally. all_channels switches the node to multi-pass mode: it takes the passes input (the NUKE_PASSES bundle from NukeReadMultiPass) and writes every pass as a multi-channel EXR - and it's smart about it, applying the colorspace conversion only to light passes while leaving data passes (normals, depth, position, motion, IDs, mattes, UVs) untouched.

Like NukeRead, colorspace describes the file on disk and encodes to it from linear Rec.709: sRGB for PNG/JPG, linear for EXR, ACEScg if the post pipeline expects AP1. raw writes as-is.

Inputs that matter

  • file_path + frame_start - where and when the sequence starts.
  • file_type - exr, tiff, png, jpg, dpx, hdr, tga, bmp, webp. Default exr.
  • bit_depth - 8, 16, 16f (half float), 32f. Default 16f - the sane default for EXR.
  • compression - EXR codecs; dwaa default, zip/zips good for interchange.
  • channels / passes - for multi-pass EXR output.

Outputs: the image (echoed) and a file_paths STRING telling you exactly what got written.

Installing it

Ships in Nuke Nodes. Manager: search "Nuke Nodes", install. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/sumitchatterjee13/nuke-nodes-comfyui.git nuke-nodes
cd nuke-nodes
pip install -r requirements.txt

Restart, find it under Add Node → Nuke → IO. No models. OpenImageIO (from requirements) is what gives you the full format list.

Gotchas

  • EXR wants a float bit depth. Writing 8-bit "EXR" is technically possible and practically useless. Stick with 16f/32f.
  • PNG output washed out? Your pipeline is linear and you wrote with colorspace="raw". Set it to sRGB so the OETF gets applied and the file looks right in a viewer.
  • all_channels needs the passes input wired. If you select it without a NUKE_PASSES connection, there's nothing to write - keep channels on rgba for plain image writes.
  • Zero community footprint on this pack, so no threads to rescue you. The tooltips in the node are genuinely good - trust them, and the io_nodes.py source when they run out.
CategoryNuke/IO

Inputs (13)

NameTypeDefaultDescription
file_pathSTRING
frame_startINT1-999999–999999
imageoptIMAGEImage input. Used when channels is 'rgb' or 'rgba'. Not needed when channels='all_channels'.
channelsoptCOMBOrgbaChannel layout for the output file: rgba - write 4 channels (RGB + alpha). Uses the IMAGE input. rgb - write 3 channels (RGB only). Uses the IMAGE input. all_channels - write all passes as multi-channel EXR. Uses the PASSES input. Colorspace conversion is applied only to light passes, not to data passes (normal, depth, position, motion, IDs, mattes, UVs).
passesoptNUKE_PASSESMulti-pass bundle from Nuke Read MultiPass. Used when channels='all_channels'.
file_typeoptCOMBOexr9 options: exr, tiff, png, jpg, dpx, hdr, +3
bit_depthoptCOMBO16f4 options: 8, 16, 16f, 32f
compressionoptCOMBOdwaa10 options: none, rle, zip, zips, piz, pxr24, +4
frame_paddingoptINT41–10Number of digits for frame numbers (e.g., 4 = 0001, 0002...)
overwriteoptBOOLEANfalseTrue: overwrite existing files at the exact target paths (each frame is written atomically via a temp file + rename). False: never clobber - if any target frame already exists, the WHOLE sequence is written with a versioned base name (name_1.0001.exr, name_1.0002.exr, ...) so one render always shares one consistent name.
create_directoriesoptBOOLEANtrue
colorspaceoptCOMBOrawColorspace to WRITE the file as on disk (matches Nuke's Write node convention). Input is assumed to be in the OCIO working space (the config's scene_linear role, e.g. ACEScg); the node converts from there into the chosen space. raw - write input as-is, no conversion (EXRs are tagged with the working-space name) any other entry - OCIO colourspace to encode to (e.g. 'sRGB Encoded Rec.709 (sRGB)' for PNG / JPG, 'ACEScg' for linear EXR) The list comes from the active OCIO config ($OCIO, or the built-in ACES Studio config) and is built when ComfyUI starts - restart ComfyUI after changing $OCIO.
show_previewoptBOOLEANtrueShow thumbnail preview in node

Outputs (2)

NameTypeDescription
imageIMAGE
file_pathsSTRING