LiveCrop
LiveCrop — crop, expand, and rotate with interactive guides right in the node
- image_ex
- image
- mask
- IMAGE_EX
- image
- mask
- BBOX
- BBOX%
LiveCrop is the rare ComfyUI node that feels like a tiny image editor. Connect an image and it shows you a preview with red guides drawn where the crop will land; drag the guides or nudge the sliders and the crop updates live. No guessing pixel values blind, no round-tripping through an external editor - you see the cut before you run anything.
It's part of the comfy-ovum grab bag, and honestly it's one of the more pleasant surprises in there. For any workflow that needs to reframe an image before it goes into a sampler or a video model - headroom cuts, letterbox removal, rotating a batch of frames 90 degrees - this is the node you'll keep coming back to.
How it works
The crop amounts are fractions, not pixels, and they're negative-only. From the schema, each side is a FLOAT slider from -1 to 0:
crop_top- negative value removes|value| × heightfrom the top.crop_bottom- same, from the bottom.crop_left/crop_right- same, from the left / right edges.
So crop_left = -0.25 chops 25% off the left side of the image. Set all four to 0 and nothing is cropped. There's also rotate_degrees, an INT that rotates in 90-degree increments (-180 to 180, step 90) - the kind of rotation that costs nothing and fixes a sideways phone capture instantly.
Three optional inputs:
image(IMAGE) - the thing you're cropping.mask(MASK) - cropped with the same operation, so your mask and image stay in sync.image_ex(DICT) - anIMAGE_EXcontext object (the pack's image-plus-metadata bundle); pass one in and you get one back, with the crop applied.
And five outputs:
IMAGE_EX- the dict form, if you're carrying metadata along.image- the cropped/rotated image.mask- the cropped mask.BBOX- crop bounds as a list[x, y, w, h]in pixels.BBOX%- the same bounds as fractions of the original dimensions.
The BBOX% output is the quiet star: normalized bounds are exactly what many ControlNet and detailer workflows want for "focus here" regions, without you doing the division by hand.
What to watch for
- No image connected → the node returns
None. It's optional-input friendly; wire an image and the preview appears (downscaled for responsiveness). - Masks pad with white. When a mask is cropped, padding uses white (255), per the README.
- Batch-friendly. Multiple images are supported, and the README hints at the workflow: adjust the crop for the second image, and by the next run that's the first image - crop as you go.
- The preview is visual; the sliders are the source of truth, so if you drag guides, the numbers update too.
Install
Ships in comfy-ovum:
cd ComfyUI/custom_nodes
git clone https://github.com/sfinktah/comfy-ovum
or ComfyUI Manager → comfy-ovum, then restart. No models, no keys - this is pure frontend + PIL work.
Gotchas
crop_* values can't be positive - the range caps at 0, so you can't pad outward with these sliders (the README's older "expand" phrasing is optimistic; today it's crop and rotate). If you need to grow the canvas, that's a different node. And remember rotations are only 90° multiples - fine for orientation fixes, not for arbitrary angles.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| crop_top | FLOAT | 0.000-1–0 | Negative values crop from top. |
| crop_bottom | FLOAT | 0.000-1–0 | Negative values crop from bottom. |
| crop_left | FLOAT | 0.000-1–0 | Negative values crop from left. |
| crop_right | FLOAT | 0.000-1–0 | Negative values crop from right. |
| rotate_degrees | INT | 0-180–180 | Rotate by multiples of 90 degrees. |
| image_exopt | DICT | — | |
| imageopt | IMAGE | — | |
| maskopt | MASK | — |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| IMAGE_EX | DICT | — |
| image | IMAGE | — |
| mask | MASK | — |
| BBOX | LIST | — |
| BBOX% | LIST | — |