Crop Film Aspect Ratio
2, 1:1, 4:5 — like you framed it on film
- image
- image
- film_format
Film formats have fixed aspect ratios, and 35mm is not 120 is not 4x5. If your generated image is 16:9 and you want it to feel like a 35mm frame, you can't fake the crop in post by slapping letterbox bars on it - you need the actual 3:2 frame. CropFilmAspectRatio takes any image and crops it to the exact aspect ratio of a real film format, which is the difference between "a photo with borders" and "a photo that looks like it was taken on film."
It sits at the front of the comfyui-jbnodes pipeline, usually right after generation and VAE decode. It's also the cheap way to get a FILMFORMAT object into CameraLab, since one of its outputs is exactly that.
How it works
Pick the format from the list: 135 (3:2), the 120 medium-format family (6x4.5, 6x6, 6x7, 6x9), or the sheet formats 4x5 and 8x10. Pick an orientation - Auto, Landscape, or Portrait. Auto picks whichever orientation fits your source without upscaling; the explicit options force the frame's orientation. Then shift (from -1 to 1) slides the crop window along the frame so you're not stuck with a dead-center crop - -1 pushes the crop toward one edge, +1 the other, letting you keep the subject's face out of the middle.
The mechanism is honest cropping: the node computes the target frame dimensions from the film format, fits the largest crop with that ratio inside your image, and cuts. No resampling, no stretching. The film_format output carries the format object forward so downstream nodes (CameraLab, FilmGrainLab) know what frame they're simulating.
The inputs that matter
- film_format - the aspect ratio you're going for. 135 for that classic 3:2; 120 (6x6) for the square.
- orientation - Auto unless you have a strong reason; Portrait is there for vertical shots.
- shift - the framing slider. This is the one beginners ignore and then wonder why every crop has the subject dead center.
Outputs: image (the cropped IMAGE) and film_format (the FILMFORMAT object for the pipeline).
Install
Same pack, same routine:
cd ComfyUI/custom_nodes
git clone https://github.com/AlbertJBurton/comfyui-jbnodes.git
cd comfyui-jbnodes
pip install -r requirements.txt
Restart ComfyUI, or ComfyUI Manager → search "comfyui-jbnodes."
Gotchas
- It crops, it does not pad. If you need to reach an aspect ratio by adding borders instead of cutting pixels, this isn't the node - that's a pad/canvas job.
- Auto orientation picks the orientation that fits without scaling; if you force the wrong one, you'll lose more image than you expected.
- Because it's a crop, you lose pixels. If you're going to print big or upscale anyway, crop first, then upscale - don't generate huge just to crop small.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| film_format | COMBO | 7 options: 135, 120 (6x4.5), 120 (6x6), 120 (6x7), 120 (6x9), 4x5, +1 | |
| orientation | COMBO | 3 options: Auto, Landscape, Portrait | |
| shift | FLOAT | 0.00-1–1 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| film_format | FILMFORMAT | — |