ComfyUI Node

Eses Lens Effects

Distortion, Chromatic Aberration, and a Vignette

By quasiblob·Created about a year ago·Updated about a year ago· 24
Eses Lens Effects
  • image
  • IMAGE
k1_master_distortion0.000
k1_red_aberration-0.010
k1_green_aberration0.000
k1_blue_aberration0.010
radial_exponent2.00
offset_x_red0.0
offset_y_red0.0
offset_x_green0.0
offset_y_green0.0
offset_x_blue0.0
offset_y_blue0.0
post_process_scale1.000
vignette_amount0.000
vignette_size0.000
vignette_falloff2.00
fit_vignette_to_frameOff
interpolation_modeBilinear
fill_modeconstant
channel_fill_color0.00

The tell on a lot of AI images isn't the hands. It's that the optics are too perfect - no barrel distortion, no fringing at the edges, no vignette pulling the corners down. Real photos come out of lenses that screw up in predictable ways, and diffusion models rarely bake those flaws in (the modidex photorealism notes call exactly this out: lens distortion "can be added in post but is rarely generated by AI models"). That's the gap Eses Lens Effects fills: one node that warps the frame, splits the RGB channels apart, re-frames, and drops a vignette on top - in a fixed order.

It comes from quasiblob, who posts on r/comfyui as ectoblob. The author built it because they'd rather have one node than a ten-node chain, and they say so in the release thread. It's also flagged in the wild as not-extensively-tested, personal-use software. Read that as "start subtle and preview as you go," not "broken."

What it actually does

Under the hood it's scikit-image's warp doing a classic radial remap on each RGB channel separately. A master distortion coefficient (k1) bends the whole frame; each channel adds its own aberration to that master; channel offsets then shift sampling positions in plain pixels. After the warp it center-crops and zooms back, vignette last. There's no reordering and no intermediate outputs - a closed box, by design.

The inputs that matter

  • k1_master_distortion - the main event. Range −2 to 0.5, default 0. Negative values bulge the frame outward (barrel), positive squeeze it inward (pincushion). Start around −0.1 to −0.2 for a believable wide-angle feel.
  • k1_red/green/blue_aberration - per-channel offsets to the master. The defaults already nudge red to −0.01 and blue to +0.01, so you get a whisper of fringing for free. Push the channels apart harder for that loud, overdone RGB-split look.
  • offset_x/y_red/green/blue - pixel-space shifts per channel, in ±100px. Unlike the aberration, this slides whole channels - old-photo misregistration. Zero by default.
  • radial_exponent - the shape of the warp's ramp from center to edge. Default 2 is the classic quadratic model; crank it higher and the distortion hugs the frame edges instead of spreading through the middle.
  • post_process_scale - a 1–3× centered zoom that crops the warped image back to its original size. Your cleanup step for the black edges the distortion reveals.
  • vignette_amount / vignette_size / vignette_falloff / fit_vignette_to_frame - positive amount darkens, negative lightens; size is the radius, falloff is the hardness; the fit toggle stretches it to your aspect ratio instead of staying circular.
  • interpolation_mode and fill_mode - quality and edge handling. Bilinear is a sane default; constant fills outside-frame pixels with channel_fill_color (black), or swap to edge/reflect/wrap if you want the borders to smear instead of go dark.

That's 20 inputs; you'll genuinely touch about seven - master distortion, the three aberrations, radial exponent, post-process scale, vignette amount. The rest live at their defaults.

Output

One IMAGE tensor - a single RGB frame, ready to wire into whatever comes next. It's not an output node, so there's no preview on it.

How to install

ComfyUI Manager covers it - search for "Eses" and grab ComfyUI-EsesImageLensEffects (the author confirmed the legit Manager entry points at their repo). Or the manual route:

cd ComfyUI/custom_nodes
git clone https://github.com/quasiblob/ComfyUI-EsesImageLensEffects
cd ComfyUI-EsesImageLensEffects
pip install -r requirements.txt

Then restart ComfyUI and you'll find "Eses Lens Effects" under Eses Nodes/Image Adjustments. No model downloads, no API keys, nothing heavy. requirements.txt is a single line - scikit-image>=0.25.2 - and most ComfyUI installs already ship it, so the pip step is often a no-op.

Common issues

  • It's a still-image node, not a video node. The code takes one frame - it squeezes the batch axis and never loops. Feed it a video batch and you'll get "too many values to unpack" when the next node expects frames. This is the #1 real-world complaint: someone hit exactly that feeding Wan 2.2 frames toward Video Combine. Apply it per-frame, not to the whole clip.
  • Alpha goes away. Output is 3-channel RGB; any alpha is silently dropped. Fine for most chains, worth knowing if you're compositing.
  • Black or smeared edges. That's the distortion exposing beyond the frame. Bump post_process_scale a hair, or switch fill_mode so the border isn't filled with channel_fill_color.
  • Sliders feel dead. Enable "Run (On Change)" from the blue play button in ComfyUI's toolbar - the author's own tip - and the warps update live as you drag.
  • You want to fix distortion, not add it. You can flip the sign of k1_master_distortion and roughly undo a lens, but the author's own advice (and mine) is to use a proper correction tool for that. This node is for adding character, not surgery.
CategoryEses Nodes/Image Adjustments

Inputs (20)

NameTypeDefaultDescription
imageIMAGE
k1_master_distortionFLOAT0.000-2–0.5
k1_red_aberrationFLOAT-0.010-0.1–0.1
k1_green_aberrationFLOAT0.000-0.1–0.1
k1_blue_aberrationFLOAT0.010-0.1–0.1
radial_exponentFLOAT2.000.5–4
offset_x_redFLOAT0.0-100–100
offset_y_redFLOAT0.0-100–100
offset_x_greenFLOAT0.0-100–100
offset_y_greenFLOAT0.0-100–100
offset_x_blueFLOAT0.0-100–100
offset_y_blueFLOAT0.0-100–100
post_process_scaleFLOAT1.0001–3
vignette_amountFLOAT0.000-1–1
vignette_sizeFLOAT0.000-1–1
vignette_falloffFLOAT2.000.5–8
fit_vignette_to_frameCOMBOOff2 options: Off, On
interpolation_modeCOMBOBilinear5 options: Nearest-Neighbor, Bilinear, Bicubic, Biquartic, Biquintic
fill_modeCOMBOconstant5 options: constant, edge, symmetric, reflect, wrap
channel_fill_colorFLOAT0.000–1

Outputs (1)

NameTypeDescription
IMAGEIMAGE