VaporWave | GlitchNodes
The vaporwave poster filter, done properly
- image
- image
VaporWave is exactly what it sounds like: it turns an image into a vaporwave poster by quantizing brightness into four color bands - cyan, magenta, purple, aqua - with hard black and white cutoffs at the extremes. Run a portrait through it and you get that instant ♥ ア シ ョ ン album-cover look: blocky color fields, dark silhouette, a touch of neon. It's simple, it's fast, and unlike a lot of the pack, it's predictable - the same input always gives the same bands.
The mechanism is clean color quantization. The image is reduced to a brightness ramp with five thresholds: threshold_dark (pixels below become black), then mid_threshold_1/2/3 splitting the midtones into four bands, then threshold_light (above becomes white). Each band gets painted with one of the four colors, and the source sorts the thresholds internally before applying them - so if you set them out of order, it silently fixes that rather than silently emptying a band. That's the kind of defensive detail that suggests the author has actually used this node. The four colors are individually adjustable (color1_r/g/b through color4_r/g/b), so you can swap the classic palette for brand colors or any scheme you like.
The inputs that matter
- threshold_dark (0–1, default ~0.059) and threshold_light (0–1, default ~0.922) - the black and white cutoffs. Narrowing the gap between them darkens the midtones and makes the color bands pop.
- mid_threshold_1/2/3 (defaults ~0.235 / ~0.471 / ~0.706) - where the four color bands split. Moving them up or down reallocates which brightness ranges get which color.
- color1_r/g/b → color4_r/g/b - the four band colors. Defaults are cyan, magenta, purple, aqua - the exact vaporwave palette. Set all four to grayscale and you get a stylized posterized black-and-white.
Output is image (IMAGE) → PreviewImage/SaveImage, and it handles batches, so you can run a whole video through it for a full vaporwave treatment.
Installing it
Part of the GlitchNodes pack:
cd ComfyUI/custom_nodes
git clone https://github.com/pxl-pshr/GlitchNodes
# restart ComfyUI
or ComfyUI Manager → Install Custom Nodes → search "GlitchNodes". Deps: numpy, torch, Pillow, opencv-python, scipy. No model downloads - this one's pure NumPy thresholding.
Gotchas
Where people get burned: the thresholds default to near the extremes (0.06–0.92), so on a flat, low-contrast image almost everything lands in the four mid bands and the poster effect reads as "washed out." If that happens, narrow the range - push threshold_dark up toward 0.15 and threshold_light down toward 0.8 - to force more black and white into the frame. Also, this is one of the pack's simpler nodes: don't expect per-pixel finesse, expect bands. That's the aesthetic. The usual pack disclaimer applies ("highly experimental... may break or even error"), but in practice VaporWave is one of the most stable things here - no randomness, no file I/O, just thresholds.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| threshold_dark | FLOAT | 0.060–1 | — |
| threshold_light | FLOAT | 0.920–1 | — |
| mid_threshold_1 | FLOAT | 0.240–1 | — |
| mid_threshold_2 | FLOAT | 0.470–1 | — |
| mid_threshold_3 | FLOAT | 0.710–1 | — |
| color1_r | FLOAT | 0.000–1 | — |
| color1_g | FLOAT | 0.720–1 | — |
| color1_b | FLOAT | 1.000–1 | — |
| color2_r | FLOAT | 1.000–1 | — |
| color2_g | FLOAT | 0.000–1 | — |
| color2_b | FLOAT | 0.760–1 | — |
| color3_r | FLOAT | 0.590–1 | — |
| color3_g | FLOAT | 0.000–1 | — |
| color3_b | FLOAT | 1.000–1 | — |
| color4_r | FLOAT | 0.000–1 | — |
| color4_g | FLOAT | 1.000–1 | — |
| color4_b | FLOAT | 0.980–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |