Nodes/ComfyUI-mrv2/mrv2 Save EXR Image
ComfyUI Node

mrv2 Save EXR Image

Save true OpenEXR from ComfyUI

By ggarra13·Created 2 years ago·Updated about a year ago· 5
mrv2 Save EXR Image
  • images
  • masks
    filename_prefixmrv2
    exr_type
    pixel_aspect1.0
    showfalse

    PNG is fine for posting. It is worthless in a compositing pipeline. If your generated frames are heading into Nuke, Fusion, or After Effects and need real HDR data - values above 1.0, unclamped linear light, no 8-bit rounding - you want OpenEXR, and the stock Save Image node won't give it to you. mrv2SaveEXRImage will. It's the "ship it back to the pipeline" half of ComfyUI-mrv2, a tiny pack written by the author of mrv2, the BSD open-source viewer VFX people use for review.

    What it actually does

    Feed it an images batch and it writes each frame as a numbered .exr file into your ComfyUI output folder - {filename_prefix}_00000.exr, _00001, and so on, using the same output path machinery as Save Image. The values go out as raw floats, which is the whole point: an EXR holds the linear/HDR data your graph produced instead of baking it through 8-bit sRGB like a PNG round-trip would. The pack's own README puts it as "ideally support a full float pipeline" - the node makes sense when your workflow stays in float end to end, not after you've already squashed everything into a display-space PNG.

    The inputs that matter

    • images - the batch to write. Channel count must be 1 or 3 or the node throws.
    • filename_prefix - defaults to mrv2. Pick something unique per workflow, for a reason I'll get to in a second.
    • exr_type - half (default), float32, or uint32. Half is 16-bit and genuinely enough for most comp work; it's half the file size and what you'd usually reach for.
    • pixel_aspect - 1.0 by default, sets the EXR header's pixel aspect ratio. Only touch it if you're producing non-square-pixel footage.
    • masks (optional) - feed a MASK and it gets appended as an A (alpha) channel in the EXR. Handy if you're exporting a cutout rather than a frame.

    The show toggle is the fun bit: flip it and the node tries to push the written file straight into a running mrv2 over localhost port 55121, or launches the mrv2 executable if nothing's listening (it hunts ~/bin/mrv2//usr/bin/mrv2 on Linux, the Program Files install on Windows, the app bundle on macOS). If you don't have mrv2 installed, just leave it off - nothing else cares.

    Gotchas, straight from the source

    Two real ones. First, before writing, the node deletes every existing {prefix}_*.exr in that output subfolder. Re-running a workflow with the same prefix silently wipes whatever was there before - that's deliberate (so stale frames don't pile up) but it means you never point filename_prefix at files you want to keep. Second, if you supply masks, the mask count has to equal the image count or it raises ValueError mid-run.

    One quirk worth knowing if a compositor ever complains: the EXR header is written as half for all channels regardless of which exr_type you picked - the bytes match your choice, but the declared pixel type doesn't. Half is correct most of the time, so you'll likely never notice. File it under "rough edges of a small pack," not a reason to avoid it.

    Install

    Two options, same as any custom node:

    • ComfyUI Manager → search ComfyUI-mrv2 → install, or
    • cd ComfyUI/custom_nodes && git clone https://github.com/ggarra13/ComfyUI-mrv2, then restart.

    It has exactly two pip dependencies - openexr and pillow (the openexr one is a compiled binding; wheels install cleanly on normal setups, but on an unusual Python build it's the thing most likely to bite). No model files, no API keys, nothing else to download.

    If you live in mrv2 this node is the missing export step between ComfyUI and your comp. If you've never touched mrv2, the sibling annotation node probably won't draw you in either - but the EXR save is genuinely useful on its own for anyone finishing footage professionally.

    Categorymrv2/save

    Inputs (6)

    NameTypeDefaultDescription
    imagesIMAGE
    filename_prefixSTRINGmrv2
    exr_typeCOMBO3 options: half, float32, uint32
    pixel_aspectFLOAT1.00.001–4
    showBOOLEANfalse
    masksoptMASK

    Outputs (0)

    No outputs