Video to Color Static ASCII Art
Video where the characters hold still but the colors keep moving
- video_frames
- ascii_video_frames
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.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| video_frames | IMAGE | — | |
| char_width | INT | 10010–1000 | — |
| font_path | STRING | cour.ttf | — |
| font_size | INT | 155–100 | — |
| ascii_charset | STRING | .'`^":;Il!i~_?[{1(|/fjxnvzXYJCLQ0Zmwqdkh*#M&8%B@$ | — |
| background_color | STRING | #000000 | — |
| invert_brightness_mapping | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| ascii_video_frames | IMAGE | — |