Nodes/ComfyUI-EsesImageAdjustments/Eses Image Adjustments2
ComfyUI Node

Eses Image Adjustments2

Eses Image Adjustments2 is your whole finishing pass

By quasiblob·Created about a year ago·Updated about a year ago· 42
Eses Image Adjustments2
  • image
  • mask
  • adjusted_image
  • output_mask
contrast1.00
gamma1.00
saturation1.00
hue_rotation0
r_offset0
g_offset0
b_offset0
gel_color255,200,0
gel_strength0.00
sharpness1.00
unsharp_strength0.00
unsharp_blur_radius0.0
unsharp_threshold3
grayscalefalse
grain_strength0.000
grain_contrast1.00
color_grain_mix1.00
use_maskfalse
invert_mask_influencefalse
mask_influence100

Eses Image Adjustments2 does what the pack name promises and nothing more: take an image in, hand back a finished one. Contrast, gamma, saturation, hue rotation, per-channel RGB offsets, a color gel tint, two flavors of sharpening, a black-and-white toggle, and film grain - all in a single node, with zero extra dependencies and no model files to hunt down. That's the whole pitch, and honestly it's a good one.

"Eses" isn't an acronym for something you're supposed to look up. It's the author's handle-flavored branding (quasiblob on GitHub, ectoblob on reddit), who built this for personal use while learning custom node development and shared it in mid-2025. The name is a lie-free one: it doesn't call any API, needs no key, and runs entirely locally.

Why you'd reach for it

ComfyUI's default answer to post-processing is a grab-bag - one node for contrast, another for color balance, a third for grain, each from a different pack with its own dependency list and install ceremony. This collapses that whole shelf into one panel you drop after VAE decode (or after upscaling, or right before Save Image) for a finishing pass. The author's framing is honest about the cost: the operations are sequential and fixed order, so this is a pipeline, not a modular toolkit. If you need to reorder steps, use dedicated nodes. For quick color correction on an image you already like, this is the fastest path.

It also slots neatly into the "post-processing for realism" playbook - subtle film grain and a gentle color cast are two of the cheapest ways to make an image look captured rather than generated, and both are right here.

How it works

Everything runs as PyTorch tensor ops on your GPU except the unsharp mask, which the author moved to Pillow on CPU (added in v1.2.0). The order is fixed: contrast → gamma → saturation → hue rotation → RGB offsets → color gel → sharpness → unsharp mask → grayscale → film grain. That order matters - grayscale runs after the color work, so you can grade and then desaturate, and grain lands last so it sits on top of everything.

Speed is the selling point. The author reports roughly 2–3 seconds for a 4000×6000 pixel image with grain enabled, and near-instant (a ~0.3s lag while dragging) at 2048×2048. Grain is the slowest step but is GPU-accelerated.

The inputs that matter

The defaults are mostly neutral (1.0, 0, off), so it's safe to drop in and tweak. The few you'll actually set:

  • contrast, gamma, saturation - all default 1.0. Pulling saturation to ~0.9 is the classic fix for AI's tendency toward oversaturation.
  • hue_rotation (-180 to 180) and the r/g/b_offset trims (-100 to 100) for real color grading.
  • gel_color (default 255,200,0) plus gel_strength - a tint, accepted as hex (#RRGGBB) or comma RGB (R,G,B).
  • sharpness and the unsharp trio (unsharp_strength, unsharp_blur_radius, unsharp_threshold) - the latter gives you far more control than the simple sharpness slider.
  • The grain trio: grain_strength (note the tiny 0–0.1 range), grain_contrast, and color_grain_mix (1.0 = colored grain, 0 = monochrome).

There's also an optional mask input with use_mask, invert_mask_influence, and mask_influence (0–100). Enable it and adjustments only affect the white areas of the mask, faded by influence - 50% influence fades the effect halfway everywhere, which is great for "grayscale the background, leave the person mostly alone."

Outputs

Two of them: adjusted_image (IMAGE - wire it into Save Image) and output_mask (MASK). The mask output is a bonus: with masking on it reflects the (influence-faded) blend weight; without a mask it's a full-white pass-through, handy for chaining into nodes that want a mask input.

Installation

No dependencies, no model downloads, nothing to configure. Either:

cd ComfyUI/custom_nodes
git clone https://github.com/quasiblob/ComfyUI-EsesImageAdjustments

then restart ComfyUI - it'll show up as "Eses Image Adjustments2" under Eses Nodes/Image Adjustments. Or search for ComfyUI-EsesImageAdjustments in ComfyUI Manager's node list and install from there.

Gotchas worth knowing

  • The requirements.txt is empty - the author's earlier post mentioned a torch>=2.6.0 pin, but the shipped file installs nothing. If you've got ComfyUI running, you have everything it needs.
  • Only tested on Python 3.12.
  • The unsharp mask runs on CPU, so on large images it'll be your slowest step while everything else rides the GPU.
  • Enable run on change (the auto-execute toggle on the menu) before dragging sliders - the author designed the workflow around live preview, and it's miserable without it.
  • Keep gel_color in one of the documented formats; a mistyped color string just won't do what you expect.
CategoryEses Nodes/Image Adjustments

Inputs (22)

NameTypeDefaultDescription
imageIMAGE
contrastFLOAT1.000–2
gammaFLOAT1.000.1–5
saturationFLOAT1.000–2
hue_rotationFLOAT0-180–180
r_offsetFLOAT0-100–100
g_offsetFLOAT0-100–100
b_offsetFLOAT0-100–100
gel_colorSTRING255,200,0
gel_strengthFLOAT0.000–1
sharpnessFLOAT1.000–2
unsharp_strengthFLOAT0.000–5
unsharp_blur_radiusFLOAT0.00–10
unsharp_thresholdINT30–255
grayscaleBOOLEANfalse
grain_strengthFLOAT0.0000–0.1
grain_contrastFLOAT1.000–2
color_grain_mixFLOAT1.000–1
maskoptMASK
use_maskoptBOOLEANfalse
invert_mask_influenceoptBOOLEANfalse
mask_influenceoptFLOAT1000–100

Outputs (2)

NameTypeDescription
adjusted_imageIMAGE
output_maskMASK