Nodes/ComfyUI ASCII Art Nodes/Video to Color Static ASCII Art
ComfyUI Node

Video to Color Static ASCII Art

Video where the characters hold still but the colors keep moving

By LamEmil·Created about a year ago·Updated about a year ago· 1
Video to Color Static ASCII Art
  • video_frames
  • ascii_video_frames
char_width100
font_pathcour.ttf
font_size15
ascii_charset .'`^":;Il!i~_?[{1(|/fjxnvzXYJCLQ0Zmwqdkh*#M&8%B@$
background_color#000000
invert_brightness_mappingfalse

Both video nodes in this pack start from the same idea: take a batch of frames and redraw each one as colored ASCII art. This one - "Video to Color Static ASCII Art" - is the clever half of the pair, because it splits the problem in two. The characters are chosen once, from the first frame, and then stay frozen for the whole video. Only the colors change, sampled fresh from each frame as it comes through.

That trade-off is exactly right for most footage. Because the character grid doesn't move, the picture stays legible - faces, buildings, and text in the source don't dissolve into noise frame to frame. What you get is the "lava lamp" effect: a stable ASCII silhouette whose colors shimmer and shift with the content. It's the more watchable output of the two, and it's also faster, since character selection runs once instead of per frame.

How it works

The node takes video_frames - a batched IMAGE tensor, meaning (B, H, W, C) - and reads the first frame's grayscale to build a static character map over the char_width grid. Then for every frame it downscales that frame to the same grid, samples the pixel colors, and redraws each fixed character in the color from the current frame. The rendered text block is LANCZOS-upscaled back to the original frame dimensions, so your output frames are the same size as your input frames. All CPU-side, pure Pillow.

Inputs and output

No text_color here (color comes from the video), no chars_per_frame (there's no typing). Just the shared set: video_frames, char_width (default 100), font_path, font_size, ascii_charset, background_color, and invert_brightness_mapping. Output is the batched IMAGE ascii_video_frames.

The two ends of the chain matter more than any single setting. Upstream, you need something that hands you an IMAGE batch - a video loader or frame extractor (the VideoHelperSuite family is the usual source). Downstream, you need a video combine node to turn the batch back into a playable file. The node itself neither loads video nor encodes it; it only transforms frames in between.

Install and gotchas

ComfyUI Manager (search "ComfyUI ASCII Art Nodes") or manual:

cd ComfyUI/custom_nodes
git clone https://github.com/LamEmil/ComfyUI_ASCIIArtNode
cd ComfyUI_ASCIIArtNode
pip install -r requirements.txt

Restart after. Only dependency is Pillow.

The recurring pack gotcha applies hardest here: default font_path cour.ttf isn't shipped, and a missing font drops you to a chunky bitmap glyph that ruins the whole video. Set font_path to a real monospace .ttf before you render anything long. Also mind char_width - with video you're multiplying it across every frame, so 100+ characters per row times hundreds of frames of Pillow text drawing is real CPU time; drop to 60–80 for quick previews. And don't rename the cloned folder; the README says ComfyUI_ASCIINodes, the repo is ComfyUI_ASCIIArtNode. Expect zero community support - this is a small single-commit hobby pack - but it does exactly the effect described.

Categoryvideo/art

Inputs (7)

NameTypeDefaultDescription
video_framesIMAGE
char_widthINT10010–1000
font_pathSTRINGcour.ttf
font_sizeINT155–100
ascii_charsetSTRING .'`^":;Il!i~_?[{1(|/fjxnvzXYJCLQ0Zmwqdkh*#M&8%B@$
background_colorSTRING#000000
invert_brightness_mappingBOOLEANfalse

Outputs (1)

NameTypeDescription
ascii_video_framesIMAGE