Film Development
Where your image actually becomes a negative
- camera_roll
- contact_print
- film_negative
In the comfyui-jbnodes pipeline, DeveloperLab is the moment the latent film image gets developed. The camera (CameraLab) has already captured a scene and applied the filter and light source; FilmGrainLab has laid grain into the emulsion. What comes out of those nodes is still a latent image - flat, weird-looking, underexposed in every sense. DeveloperLab is what turns that into a real B&W negative and a positive contact print.
The reason this node exists as a separate step instead of being folded into the camera is that development is where you control tone. Push the film and shadows block up. Pull it and the whole frame flattens. That's the N_development control, and it's the single most film-authentic knob in the pack.
How it works
The node builds a development curve - a generalized sigmoid LUT from the pack's lut_lib - and maps the latent image's density onto it. precision (256–65536, default 4096) sets the LUT resolution: higher is smoother and costlier, and the practical effect is tiny above 4096, so leave it unless you're chasing artifacts. dynamic_range (3–12, default 10) sets how many stops of tonal range the curve spans - this is your paper-vs-display contrast budget. exposure_index (0–1, default 0.1) biases overall exposure.
N_development is the push/pull control, and the film person in you will love it: -3 to +3, in whole stops, mirroring the real practice of over- or under-developing to move the curve. Push +1 and your shadows go blocky and contrasty, just like pushed Tri-X. Pull negative and you get that soft, compressed, flat-negative look. It directly changes the shape of the response curve, not just brightness - that's the whole point of having it separate from exposure.
The developer dropdown is currently a single "None" entry and populated dynamically - the development process options are on the way, but the curve, push/pull, and range knobs already work.
apply_film_grain (default on) decides whether grain rides along through development. Turn it off if you added grain elsewhere or want a clean negative to test against.
Outputs
Two images, and people get these confused:
film_negative- the actual developed negative, tones inverted. This is what you feed the PrintLab nodes.contact_print- the positive image, like a proof sheet print straight from the negative. Use it to judge the shot quickly.
Both are IMAGE type. The negative is the darkroom currency; the contact print is the preview.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/AlbertJBurton/comfyui-jbnodes.git
cd comfyui-jbnodes
pip install -r requirements.txt
Restart ComfyUI, or install via ComfyUI Manager ("comfyui-jbnodes"). Deps: numpy, torch, colour-science, scipy, Pillow.
Gotchas
- Wire
film_negative(notcontact_print) into the PrintLab enlargers - feeding the positive into a printer gives you a double-inverted mess. - Expect the negative to look flat and low-contrast. That's a negative, not a failure; the contrast lands in the printing step.
- The developer list is thin right now (one option). Don't hunt for D-76 or Rodinal - the process presets haven't shipped yet, which is consistent with the pack's beta status.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| camera_roll | CAMERA | — | |
| developer | COMBO | 1 options: None | |
| apply_film_grainopt | BOOLEAN | true | — |
| precisionopt | INT | 4096256–65536 | — |
| exposure_indexopt | FLOAT | 0.100–1 | — |
| N_developmentopt | INT | 0-3–3 | — |
| dynamic_rangeopt | FLOAT | 10.03–12 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| contact_print | IMAGE | — |
| film_negative | IMAGE | — |