Safe Area Overlay
Find out your crop ate the subject before you save it
- image
- image
Cinematic crop is a lovely idea until you notice it took the top of someone's head off, or that the subtitle line now sits over an eye. This node draws the framing furniture you'd get in a camera viewfinder - rule-of-thirds grid, an action-safe rectangle, a center cross - straight onto a copy of the image so you can see what the crop is about to do.
It's a check, not a grade. The pack's own README is explicit that you bypass it for the final save, which is the correct way to treat any node whose output is "the same image plus my scribbles."
What it draws
Everything is burned into the pixels by PIL, over a transparent RGBA layer that's composited back down:
- Rule-of-thirds grid - lines at 1/3 and 2/3 on both axes, drawn fainter than the rest (about 43% alpha, and one pixel thinner than
line_width) so you can still read the image through them. This is the composition check: are the eyes on the upper third line, is the horizon on a third, is the subject dead-center when it shouldn't be. - Action-safe rectangle - an inset from each edge, brighter (about 78% alpha), showing the region that survives a typical tight crop or a player's UI. The broadcast convention is the useful mental model here: action-safe keeps the important stuff in frame, title-safe is the smaller box where text is safe.
safe_marginat its default 0.1 is roughly the action-safe box. - Center cross - small crosshair with arms a twenty-fourth of the short side, for checking that the subject is actually centered when the composition calls for it.
The margins are per-axis fractions, not pixels, so the overlay scales with resolution and looks identical on a 1024 test render and a 4K final.
Controls
safe_margin (0–0.25, default 0.1) is the only one with a real decision in it. The tooltip's framing is the honest one: 0.1 keeps titles clear of the cinematic crop. Drop it to 0.05 for a longer lens feel or a looser crop; push it toward 0.2 if you're previewing for a platform that eats the edges.
show_thirds and show_center are independent toggles. line_width (1–16) sets the weight of the bright lines; unlike the compare node's divider it can't be zeroed, so the way to get a clean frame is to bypass the node, not to hide the line.
The single output is image, an IMAGE like the one you fed in. It's not an output node, so put a PreviewImage or SaveImage downstream of it or you'll see nothing. Batch input works - every frame in the batch gets the overlay.
Wiring it without ruining your render
The trap is that the overlay is in the pixels from this point on. Downstream nodes treat the grid as image content: your grain pass will grain it, your watermark will stamp over it, and a save node will write it into the file. So don't splice it into the main path. Create a parallel branch off the decode (or off the tail of the chain you're checking), feed that branch into this node and into its own Preview/Save, and leave the real output path alone. If you do put it inline, remember to Ctrl+B it before the final save - a bypassed node passes its input straight through.
The shipped example workflow does exactly this: the overlay sits on its own branch off the finished frame and feeds its own timestamped WebP save, not the main output. Framing check on the side, clean file on the disk.
One caveat on what the rectangle is telling you: it's a generic safe area, not a measurement of the pack's cinematic crop. Cinematic Frame & Subtitle crops to a fixed aspect ratio from the center, so the safe rectangle is a good proxy for "is anything important near an edge" and not an exact preview of that crop's cut lines. If you want to see the cut, run the frame node and look.
Install
ComfyUI Manager → search ComfyUI-FeiFei. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/aifeifei798/ComfyUI-FeiFei.git
# restart ComfyUI, nodes appear under the FeiFei category
Stock ComfyUI dependencies only - torch, numpy, Pillow. The pack's requirements.txt also lists openai>=1.40 for its prompt and captioning nodes, which this one never touches. No models to download, no network calls, nothing to configure.
If it looks wrong
Nothing draws at all - check show_thirds / show_center and make sure there's a save or preview node after it. A rectangle is always drawn, by design: there is no toggle for the action-safe box, and safe_margin = 0.0 puts its outline on the frame edge rather than removing it. If you want nothing on the image, bypass the node. If the overlay reads too faint against a bright frame, raise line_width - the alpha is fixed in the code, so don't go hunting for an opacity widget.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| safe_margin | FLOAT | 0.100–0.25 | Action-safe inset as a fraction of each side. 0.1 keeps titles clear of the cinematic crop. |
| show_thirds | BOOLEAN | true | — |
| show_center | BOOLEAN | true | — |
| line_width | INT | 21–16 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |