Nodes/ComfyUI-Majoor-ImageOps/〽️ Image Ops Vignette
ComfyUI Node

〽️ Image Ops Vignette

Pull the eye to the middle (or tint the edges any colour you like)

By MajoorWaldi·Created 9 months ago·Updated 24 days ago· 14
〽️ Image Ops Vignette
  • color
  • image
  • mask
  • image
  • mask
◄bypassfalse►
◄amount0.50►
◄size1.00►
◄softness0.60►
◄center_x0.50►
◄center_y0.50►
◄invert_maskfalse►

You already know what a vignette is: darken the corners, the middle pops. It's the oldest trick in the grade, and it's also one of the four moves in the community's standard recipe for making a frame stop looking generated - grain, camera shake, channel fringing, vignette, per post-processing.md. Real lenses vignette anyway when they're wide open, so a subtle one is less an effect than a missing optic.

ImageOps Vignette is a small node that does it well, with one implementation detail that makes it more useful than the usual "multiply by a radial gradient".

How it works

Most vignette nodes multiply the frame by a radial falloff. This one lerps toward a colour instead. From nodes/vignette.py:

falloff  = t * amount_t          # t = normalised distance from centre
out_rgb  = rgb * (1.0 - falloff) + tint * falloff

Normalised distance from the centre t is scaled by amount and used to blend each pixel toward tint, which is just the hex you put in color. Two consequences fall out of that. First, color isn't decoration - set it to a warm brown and the corners get a faded-film cast instead of going black. Second, a light colour works too: a white or cream vignette gives you an edge glow rather than a darkening. That's a genuinely different look from every multiply-based vignette node, and worth knowing before you assume the colour field is pointless.

The knobs that matter

  • amount (default 0.5, 0 → 1): how strong the falloff gets. At 0 the node short-circuits and returns the input unchanged.
  • size (default 1.0, 0 → 2): the radius, in normalised frame units, where the vignette reaches full amount. Under 1.0 pulls the full-strength ring inward and eats more of the frame.
  • softness (default 0.6, 0.01 → 2): the falloff width - how far inward the edge feathers from size. Low values give a defined ring; high values give a slow, moody gradient.
  • center_x / center_y (default 0.5, 0.5, −1 → 2): where the vignette is centred. Nudging this off-centre is the difference between "stock vignette" and "the light is coming in from the top-left".
  • color (default #000000): the colour the edges fade toward.
  • invert_mask and bypass.

Inputs: image and an optional mask; outputs: image and mask. Wire the image output onward to Preview or Save Image, and the mask output wherever you need the effect mask carried through.

Sane starting points: 0.3–0.5 amount, size around 1.0–1.3, softness 0.5–0.9. If a viewer can point at where your vignette starts, it's too strong - that's the whole test.

Installing it

cd ComfyUI/custom_nodes
git clone https://github.com/MajoorWaldi/ComfyUI-Majoor-ImageOps

Restart ComfyUI and hard-refresh the browser (Ctrl+F5, or Cmd+Shift+R on macOS). The pack ships its own frontend JS for the queue-free live preview - with a stale browser cache you'll see the node but no live canvas, and you'll waste an hour thinking the install failed. ComfyUI Manager users can search ComfyUI-Majoor-ImageOps. There's nothing to download and no extra pip packages; the one hard requirement is ComfyUI 0.19.0 or newer, because the pack uses the V3 node schema and won't register on older builds.

Where people get burned

  • The corners look like grey haze instead of shadow. That's the lerp doing its job with a color that isn't black - check whether something set it to a light or desaturated value. Set color back to #000000 for a clean darken.
  • It's eating your subject, not the background. size is too small or the centre is off. Push size up and raise softness so the falloff starts later and ends gently.
  • It doesn't look like a lens, it looks like a sticker. Almost always too much amount with too little softness. Real vignetting is a gradient you notice only when you turn it off.
  • This node is one of the ones the pack can run on CPU with IMAGEOPS_COMPUTE_DEVICE=cpu - useful when you're processing a video batch and don't want to fight the sampler for VRAM.
Categoryimage/imageops

Inputs (10)

NameTypeDefaultDescription
bypassBOOLEANfalse—
amountFLOAT0.500–1—
sizeFLOAT1.000–2Radius (in normalized frame units) where the vignette reaches full amount.
softnessFLOAT0.600.01–2Falloff width. Larger values feather the edge further inward from size.
center_xFLOAT0.50-1–2—
center_yFLOAT0.50-1–2—
colorCOLOR#000000Color the vignette darkens toward.
invert_maskBOOLEANfalse—
imageoptIMAGE,VIDEOImages/Video input.
maskoptMASK—

Outputs (2)

NameTypeDescription
imageIMAGE—
maskMASK—