Exposure & Tone
The Camera Raw basics panel, as a single ComfyUI node
- image
- image
Every raw editor on earth opens with the same six controls: exposure, contrast, highlights, shadows, whites, blacks. That panel is where most photography actually happens - it's the whole "expose for the subject, grade the tones" philosophy in six sliders. Exposure & Tone is that panel as a single ComfyUI node, and it's the natural first stop in any Darkroom grade.
The six sliders
exposure(−5 to +5 EV) - the whole-image brightness in f-stops. +1 doubles brightness, exactly like opening up a stop of light. This is the "get the overall exposure right" control; everything else is relative to it.contrast(−100 to +100) - midtone contrast around 18% grey, the photographer's reference point for "middle gray." Positive pushes midtones apart for punch; negative flattens.highlights(−100 to +100) - the top ~25% of the tonal range. Push positive to lift, negative to recover clipped highlights. This is the recovery slider that pulls detail back from a bright sky.shadows(−100 to +100) - the bottom ~25%. Positive opens shadows up, negative crushes them. The classic "lift the shadows so you can see into the dark areas" control.whites(−100 to +100) - the top ~10%, the white clipping point. Positive pushes whites toward true white; negative pulls them down.blacks(−100 to +100) - the bottom ~10%, the black clipping point. This is how you set whether the image has true black or lifted, filmic black.
If that order feels familiar, it should - it's the Lightroom/Camera Raw basic panel, and the two sets overlap deliberately: highlights/shadows are parametric (they recover or compress without hard-clipping), while whites/blacks set the actual endpoints.
Plus the pack-standard strength blend (0–1) to dial the whole adjustment back.
How it works
Like everything in Darkroom, it operates in linear light - sRGB gamma is removed before processing and reapplied after, which is why the exposure slider behaves like real stops rather than a flat brightness multiply. That linear-light math is the whole pack's architecture and it's why the nodes compose so cleanly: exposure first, then White Balance, then the grading nodes, then grain.
Output is a single image. It's a per-pixel color transform, so it's on the README's list of nodes you can put inside a LUT bake chain - an exposure-and-tone adjustment is exactly the kind of thing you'd want to bake into a .cube for reuse.
How to actually use it
The professional order is: set exposure first so the overall image reads right, then pull highlights down to recover any blown areas, then lift shadows to see into the dark, then use whites/blacks to set clean endpoints, and finally add contrast last - because contrast after endpoint-setting behaves predictably, while contrast before fights your endpoints.
A common beginner mistake: fixing a dark image by cranking exposure and whites at once. Exposure already moves the endpoints; adding whites on top clips everything to white. Let one control do its job, look at the histogram, then move on.
Installing it
Part of the full ComfyUI-Darkroom pack:
cd ComfyUI/custom_nodes
git clone https://github.com/jeremieLouvaert/ComfyUI-Darkroom.git
pip install -r ComfyUI-Darkroom/requirements.txt
Or search "Darkroom" in ComfyUI Manager. Needs scipy, opensimplex, rawpy, exifread, Pillow. Restart and it's under AKURATE/Darkroom/Raw. No GPU, no models, no API - pure numpy/scipy, instant even on large batches.
It's not a flashy node. It's the boring, essential one - and most good grades start here, whether the image came out of a camera or a diffusion model.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| exposure | FLOAT | 0.0-5–5 | Exposure in EV stops. +1 = double brightness |
| contrast | FLOAT | 0-100–100 | Midtone contrast around 18% grey |
| highlights | FLOAT | 0-100–100 | Recover or boost highlights (top ~25% of tonal range) |
| shadows | FLOAT | 0-100–100 | Open up or crush shadows (bottom ~25% of tonal range) |
| whites | FLOAT | 0-100–100 | White clipping point adjustment (top ~10%) |
| blacks | FLOAT | 0-100–100 | Black clipping point adjustment (bottom ~10%) |
| strengthopt | FLOAT | 1.000–1 | Blend between original (0) and adjusted (1) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |