Nodes/comfyui-jbnodes/B&W Film Camera
ComfyUI Node

B&W Film Camera

The fake camera that decides how your image 'sees'

By AlbertJBurton·Created 6 months ago·Updated 3 months ago· 1
B&W Film Camera
  • image
  • film_format
  • camera_roll
  • film_latent_preview
camera
filterNone
film
light_source

Most film-sim tools are just LUTs and grain on top of a finished image. CameraLab is not that. It's the front end of the comfyui-jbnodes pipeline: the step where a full-color image actually gets taken by a camera - lens filter in front, light source chosen, film stock's spectral response doing the work - and comes out the other side as a latent B&W "negative" that the rest of the pipeline develops and prints.

The name on the box is "B&W Film Camera" and that's the honest read. You feed it a color IMAGE (from Load Image, or from a decoded KSampler output) and it hands you a camera_roll - the pack's CAMERA type that carries the image plus all the metadata the next nodes need.

How it works

CameraLab does three physically-motivated things in one pass. It applies the selected Wratten filter as a real spectral transmission curve (not a color grade - the pack's wratten_filters.json has measured per-wavelength transmission data). It reweights the scene by the chosen light_source color temperature, from Tungsten (2856 K) through Daylight (6500 K) to Shade (7500 K), plus the ISO 7589 standard illuminants. And it runs the result through the film stock's spectral sensitivity to produce the latent image. The red filter turning a blue sky black isn't a trick - it's the filter's transmission curve doing exactly what the glass would do.

The filter choice is where the character comes from, and the list is proper Wratten: No. 8 (K2) Yellow, No. 11 (X1) light yellow-green, No. 15 (G) very deep yellow, No. 25 (A) Red, No. 38 light blue, No. 66 very light green, and more. Yellow is the subtle correction filter; red is the dramatic one that crushes skies and lightens skin against them.

Inputs and outputs

The inputs that matter:

  • filter - the Wratten filter. Start with None, then try the yellows before you jump to red.
  • light_source - sets white balance context. Daylight for most things; Shade will warm (and thus shift the B&W tonal separation).
  • film_format - a FILMFORMAT object, usually from FilmAspectRatio or CropFilmAspectRatio. It sizes grain and frame behavior downstream.
  • film - dynamic dropdown populated with the bundled stock list (Tri-X 400, HP5+, T-Max, Delta, Acros, XP2, and a lot more). Currently a single camera option; the dropdown is a dynamic widget that fills in from the browser UI.

Outputs are camera_roll (the CAMERA object) and film_latent_preview, an IMAGE preview you can eyeball while you're tuning. Note what you're looking at: that preview is the latent image before development. It will look flat and strange - that's correct. The real tonal curve shows up after DeveloperLab.

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 grab it via ComfyUI Manager by searching "comfyui-jbnodes." Dependencies are numpy, torch, colour-science, scipy, Pillow - colour-science and scipy are the ones Manager will have to pull that a stock ComfyUI lacks.

Gotchas

  • The output is a CAMERA object, not an image. Don't wire camera_roll into a preview node - use film_latent_preview to look, and feed camera_roll into FilmGrainLab/DeveloperLab.
  • The film and camera dropdowns are dynamic widgets. They populate in the browser UI; if you're hitting the node via a raw API call they can arrive as [None] and the node has a VALIDATE_INPUTS bypass for exactly that reason. In normal ComfyUI usage it just works.
  • It's beta software, so expect the occasional breaking change between versions - the README says so in bold.
CategoryJBNodes

Inputs (6)

NameTypeDefaultDescription
imageIMAGE
film_formatFILMFORMAT
cameraCOMBO1 options:
filterCOMBONone7 options: None, No. 8 (K2) - Yellow, No. 11 (X1) - Light Yellow-Green, No. 15 (G) - Very Deep Yellow, No. 25 (A) - Red, No. 38 - Light Blue, +1
filmCOMBO1 options:
light_sourceoptCOMBO9 options: Tungsten (2856 K), Cool White (5000 K), Flash (5500 K), Overcast Sky (6000 K), Daylight (6500 K), Shade (7500 K), +3

Outputs (2)

NameTypeDescription
camera_rollCAMERA
film_latent_previewIMAGE