Eses Lens Effects
Distortion, Chromatic Aberration, and a Vignette
- image
- IMAGE
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_modeandfill_mode- quality and edge handling. Bilinear is a sane default;constantfills outside-frame pixels withchannel_fill_color(black), or swap toedge/reflect/wrapif 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_scalea hair, or switchfill_modeso the border isn't filled withchannel_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_distortionand 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.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| k1_master_distortion | FLOAT | 0.000-2–0.5 | — |
| k1_red_aberration | FLOAT | -0.010-0.1–0.1 | — |
| k1_green_aberration | FLOAT | 0.000-0.1–0.1 | — |
| k1_blue_aberration | FLOAT | 0.010-0.1–0.1 | — |
| radial_exponent | FLOAT | 2.000.5–4 | — |
| offset_x_red | FLOAT | 0.0-100–100 | — |
| offset_y_red | FLOAT | 0.0-100–100 | — |
| offset_x_green | FLOAT | 0.0-100–100 | — |
| offset_y_green | FLOAT | 0.0-100–100 | — |
| offset_x_blue | FLOAT | 0.0-100–100 | — |
| offset_y_blue | FLOAT | 0.0-100–100 | — |
| post_process_scale | FLOAT | 1.0001–3 | — |
| vignette_amount | FLOAT | 0.000-1–1 | — |
| vignette_size | FLOAT | 0.000-1–1 | — |
| vignette_falloff | FLOAT | 2.000.5–8 | — |
| fit_vignette_to_frame | COMBO | Off | 2 options: Off, On |
| interpolation_mode | COMBO | Bilinear | 5 options: Nearest-Neighbor, Bilinear, Bicubic, Biquartic, Biquintic |
| fill_mode | COMBO | constant | 5 options: constant, edge, symmetric, reflect, wrap |
| channel_fill_color | FLOAT | 0.000–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |