Nodes/WWAA-CustomNodes/🪠️ WWAA Dither Image
ComfyUI Node

🪠️ WWAA Dither Image

Retro dithering on images or video, with 12 algorithms and GPU speed

By hgabha·Created 2 years ago·Updated 6 months ago· 38
🪠️ WWAA Dither Image
  • image
  • IMAGE
dither_type
contrast1.0
scale1
threshold128
invertfalse
use_gputrue

The WWAA Dither Image node applies that grainy, halftone, retro-computer look to images - and, crucially, to video - with a dozen dithering algorithms and a handful of knobs. It's one of the more popular nodes in the WWAA-CustomNodes pack from WeirdWonderfulAI.Art, and the author's own Reddit thread on it (posted early 2025) drew a genuinely enthusiastic response - including a knowledgeable commenter who checked whether it had fallen into the known Python-Pillow dithering bug, and confirmed it hadn't, because it ships a custom implementation.

That's the deep-cut detail worth knowing: Pillow's built-in dithering has a longstanding bug, so this node implements error diffusion itself (vectorized on the GPU). The same thread announced GPU support making video processing about 10× faster, and the pack ships a ready-made "Dither Node - Video Transform" workflow example.

How it works

Feed it an image (works per-frame on a batch, so a video batch just works) and pick dither_type from 12 options: Floyd-Steinberg, Atkinson, Ordered, Bayer, Random, Jarvis-Judice-Ninke, Stucki, Burkes, Sierra, Two-Row Sierra, Sierra Lite, and Halftone. Error-diffusion types (Floyd-Steinberg, Atkinson, and friends) scatter quantization error to neighbors; Ordered/Bayer use fixed threshold patterns (Bayer is the fastest and gives that classic computer look); Halftone does the print-style dot pattern.

The controls: contrast (0–2) pre-stretches values before dithering, threshold (0–255, default 128) is the quantization cutoff, invert flips black/white, scale (1–10) downscales by an integer factor before dithering and back up after - the quick way to get chunky pixel blocks. use_gpu (default on) routes the vectorized ops to CUDA when available; the pack's image nodes need OpenCV in ComfyUI's Python environment, so if the menu's missing, that's the first thing to check.

Inputs that matter

  • dither_type - the algorithm; Bayer is fast and retro, Atkinson nails the VGA look.
  • threshold - the main look-shaping knob.
  • scale - integer downscale for chunky pixels.
  • use_gpu - leave on for video.

Installing it

It's in the pack:

cd ComfyUI/custom_nodes
git clone https://github.com/hgabha/WWAA-CustomNodes

Restart ComfyUI. Or ComfyUI Manager → search "WWAA Custom Nodes" → install → restart. It's under 🪠️ WWAA/image. No models to download.

Gotchas

The threshold default of 128 assumes your values are already on the 0–255 scale the algorithm quantizes against - if your output looks wrong or washed out, play with contrast and threshold together. scale downscales by integer factors only, so you can't request a fractional scale. And for very large video batches, even with GPU you may want to test one frame first, since error diffusion is inherently sequential per row. For a retro look that's actually fast, Bayer + a moderate scale is the sweet spot - the combo the author demos on video.

Category🪠️ WWAA/image

Inputs (7)

NameTypeDefaultDescription
imageIMAGE
dither_typeCOMBO12 options: Floyd-Steinberg, Atkinson, Ordered, Bayer, Random, Jarvis-Judice-Ninke, +6
contrastFLOAT1.00–2
scaleINT11–10
thresholdINT1280–255
invertBOOLEANfalse
use_gpuBOOLEANtrue

Outputs (1)

NameTypeDescription
IMAGEIMAGE