Nodes/ComfyUI Deploy/External EXR (ComfyUI Deploy)
ComfyUI Node

External EXR (ComfyUI Deploy)

Feed HDR EXR files into a workflow — tonemapping included, no Photoshop trip required

By BennyKok·Created 3 years ago·Updated 9 months ago· 1,529
External EXR (ComfyUI Deploy)
  • default_image
  • default_mask
  • image
  • mask
â—„input_idinput_exrâ–º
â—„exr_fileâ–º
â—„tonemapsRGBâ–º
â—„display_nameâ–º
â—„descriptionâ–º

If your pipeline touches HDR imagery - lighting passes, 3D-render EXRs, IC-Light-style relighting inputs, VFX plates - this is the ComfyDeploy input node for it. "External EXR" loads an OpenEXR file from a URL or a local path, converts it into a regular IMAGE tensor, and even hands you the alpha channel as a MASK. It's the image input node for people whose source material is brighter than 1.0.

Why this matters in the ComfyUI Deploy context: the standard External Image node reads JPEG/PNG, which clamps everything to the 0–1 display range. EXR files carry real float32 HDR values - highlights that blow past 1.0, scene-linear data straight out of a renderer. Feed that into the plain image path and you get clipped garbage; this node preserves the intent and lets you choose how to compress it back into something a diffusion model can see.

How it works

It reads the EXR with OpenCV (imread with the unchanged flag), flips it to RGB, and then applies the tonemap you picked:

  • linear - leaves values as-is. Use this if a downstream node (or you) will handle the HDR math.
  • sRGB - the default, encodes linear values back to sRGB display space and clamps. Safest for feeding into a standard img2img chain.
  • Reinhard - tone-maps highlights with the classic x / (1 + x) curve, then applies sRGB. Best when the source has crazy dynamic range and you want everything visible.

If the file has an alpha channel, it becomes the mask output - handy for compositing or for workflows that need transparency.

Inputs and outputs

  • input_id - the key ComfyDeploy matches API arguments to.
  • exr_file - a local path or an http(s):// URL. Empty means "use the defaults."
  • tonemap - linear, sRGB, or Reinhard (default sRGB).
  • Optional: default_image, default_mask (used when no file is given or loading fails), plus display_name/description for how it shows in the dashboard.

Outputs: image (IMAGE) and mask (MASK). Wire the image into your VAE/img2img input and the mask into anything that wants a transparency signal.

Installing it

Pack install, same as the rest of ComfyUI Deploy:

cd ComfyUI/custom_nodes
git clone https://github.com/BennyKok/comfyui-deploy.git

Restart ComfyUI, or grab it via ComfyUI Manager ("ComfyUI Deploy"). OpenCV is a declared dependency of the pack, so EXR support should just be there - it's the same library the EXR output node uses. No model downloads.

Where people get burned

The classic mistake is not realizing the tonemap matters: leave it on linear and feed the result straight into a model and you'll wonder why everything looks washed out or blown - the model expects display-range data. sRGB is the safe default for most pipelines.

Also, this node expects EXR input. Point it at a .png and OpenCV's IMREAD_UNCHANGED may read it as a different channel layout entirely, producing a weird tensor instead of a clean error. If something's off, check your source file is genuinely EXR - and if ComfyDeploy is downloading it from a URL, remember it has to survive the dashboard's storage, not just your local disk.

Category🔗ComfyDeploy

Inputs (7)

NameTypeDefaultDescription
input_idSTRINGinput_exr—
exr_fileSTRING—
tonemapCOMBOsRGB3 options: linear, sRGB, Reinhard
default_imageoptIMAGE—
default_maskoptMASK—
display_nameoptSTRING—
descriptionoptSTRING—

Outputs (2)

NameTypeDescription
imageIMAGE—
maskMASK—