Dither
Ordered dithering for that retro color-depth look
- image
- IMAGE
Reduce an image to 8 levels per channel and the result is banding, unless you add noise that fools the eye into seeing smooth gradients. That trick - distributing quantization error as a pattern instead of letting it clump into bands - is dithering, and it's the reason old 16-color games and 256-color web art still read as smooth. Dither from WtlNodes is a proper ordered dithering implementation: pick a method, set per-channel levels, and out comes a reduced-color image with deliberate, reproducible texture.
It's a niche look, but a real one. If your pipeline touches pixel-art, retro-game styling, print-prep, or any aesthetic that wants visible color quantization without banding, this is the node.
The inputs
dither_method-none,bayer,arithmetic_add, orblue_noise. The method is the character of the texture:bayer- the classic ordered matrix dither, regular and geometric. The "retro game" look, and the default you'll want for most pixel art.arithmetic_add- a simpler additive pattern; coarser and more uniform.blue_noise- randomly distributed, organic texture, less geometric than Bayer. Better for photographic images, closer to how film grain breaks up tone.
r_levels/g_levels/b_levels- color depth per channel, 2 to 256, default 8. This is where the "retro" lives: 8 levels per channel is that classic low-color look; higher levels (32, 64) give a subtler, film-like quantization. Because they're per-channel, you can keep skin tones fine (g/b at 32) while crushing the red channel for an effect.dither_scale- 0.25 to 5: scales the dither pattern's amplitude. Lower = subtler, higher = more visible texture.apply_type- the pack-wide live-preview dropdown.
One IMAGE out.
How to use it well
The look is entirely in the levels and the method. For pixel-art: bayer, levels around 8–16 per channel, and a dither_scale of 1 - that's the clean, authentic crunch. For a photographic "printed" feel: blue_noise with levels 32–64 keeps gradients smooth while adding a printable texture that hides banding. The two methods aren't interchangeable in character; matching method to intent is most of the skill.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Scorpiosis0/ComfyUI-WtlNodes.git
Restart ComfyUI, or install via ComfyUI Manager (search "WtlNodes"). No models, no heavy deps.
Gotchas
- Dithering reduces color depth on purpose. If the output looks "crushed," that's the point - check the per-channel
levels, not the node. Levels of 256 per channel is essentially no reduction. dither_scaleup = texture, not detail. Crank it to 5 and you get aggressive noise, not finer shading. The texture IS the aesthetic here.- Bayer has a direction. Its matrix pattern is geometric and can produce moiré on fine repeating detail in the source. If you see weird interference patterns on fabric or foliage, switch to
blue_noise.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| dither_method | COMBO | 4 options: none, bayer, arithmetic_add, blue_noise | |
| r_levels | INT | 82–256 | — |
| g_levels | INT | 82–256 | — |
| b_levels | INT | 82–256 | — |
| dither_scale | FLOAT | 1.000.25–5 | — |
| apply_type | COMBO | 3 options: none, auto_apply, apply_all |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |