Textify
Turn any image into colored ASCII art (it's not a text generator)
- image
- Image
You know those __=;~ monochrome ASCII portraits from the 90s? Textify is that, but alive: it takes any image, converts it to characters drawn in your choice of font, and - here's the fun part - keeps the color. Dark hair becomes a block of # and @ in brown, skin becomes = and + in flesh tones. What you get out is still an IMAGE, so you can save it, upscale it, or drop it anywhere in your graph.
One thing up front: this is not a text-generation node, and it isn't one of those "image to ASCII string" utilities either. No LLM, no API, no model download, no key. The name is a bit of a lie - it doesn't output text you can copy, it draws the text as pixels. If you want a one-off fun output for a profile picture or a gimmick poster, it's a great five-minute detour.
How it works
The mechanism is refreshingly old-school, and the source is small enough to read in one sitting. The node loads your font with Pillow's ImageFont.truetype, renders every character in your charset to a tiny bitmap, and thresholds the input image to black-and-white (with optional Floyd–Steinberg dithering). Then it tiles the image into character-sized cells and, in Match Shape mode, picks the character whose bitmap agrees with the cell's on the most pixels.
The color part is the clever bit. For the winning character, it samples the original image through that character's bitmap mask and averages the colors, so each glyph is filled with the average color of the region it "covers." That's why the output looks like the photo instead of a gray wall of symbols.
The inputs that actually matter
There are six inputs, but you'll touch maybe three:
- image - any
IMAGE. Wire it in after VAE decode (it wants real RGB pixels, not latents). - font - path to a valid
.ttfor.otf, or an installed font name. Default isconsola.ttf. Use a monospaced font. The README says it and it's right: proportional fonts make the grid look drunk. - font_size - 4 to 256, default 6. This is the whole game, see below.
- mode -
Match Shape(the good one),Ordered(cycles the charset regardless of shape), orRandom. Ordered and Random are party tricks; Match Shape is what makes it recognizable. - charset - the characters to draw with, defaulting to all printable ASCII. The author's own tooltip warns you: empty space and tiny characters produce shallow color in dark areas during shape matching, so keep some dense glyphs like
@,#, andWin the set. - dither - on by default, and only does anything in Match Shape mode. Leave it on; it gives the shape matcher detail to bite into.
The single output is Image (an IMAGE), ready to plug into a preview or save node.
Installing it
The usual two ways, and this one is painless:
- ComfyUI Manager: search for "Textify" and install, then restart.
- Manual:
cd ComfyUI/custom_nodes && git clone https://github.com/dewberryants/comfyui-textify, then restart ComfyUI.
No extra dependencies to chase - the pyproject.toml only declares Pillow, numpy, and torch, all already present in a working ComfyUI install. No model files to download, no VRAM to budget. Pure CPU pixel-crunching; you could run it on a toaster.
Where people get burned
- The default font won't exist off Windows.
consola.ttfis Consolas, a Windows system font. On Linux or macOS,ImageFont.truetypewill throw a "cannot find font" error until you give it an actual path to a.ttfor.otfyou have on disk. - Legibility is a resolution problem. The output image is exactly the same size as the input, and
font_sizesets the glyph size. At the default 6 on a 1024px image you get ~170 characters per line - it reads as texture, not text. Want readable ASCII? Crankfont_sizeway up (it goes to 256) or upscale the input first - that trade-off is most of the fiddling. - The output is RGBA. The node hands back a 4-channel image. Fine for a PNG preview or save, but don't feed it straight into a latent-encode or RGB-only node without dealing with the alpha channel.
Last caveat: this is a brand-new, tiny pack - one node, one commit, and zero community discussion anywhere. If something misbehaves, the GitHub issues page is your only resource. Fun little node; just don't build a production pipeline on it.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | This is an image | |
| font | STRING | consola.ttf | Path to a valid .ttf or .otf file. |
| font_size | INT | 64–256 | — |
| charset | STRING | !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~ | The characters to use. By default, this is all standard ASCII characters. Be aware that when shape matching, the empty space and very small characters will usually lessen color depth in dark areas of the image. |
| mode | COMBO | Match Shape uses a simple bitmap matching algorithm to determine which character touse from the charset. Ordered uses the charset in order,while random chooses random characters from the set. | |
| dither | BOOLEAN | true | Whether to use dithering to get more detailed shapes to match (does nothing for ordered and random modes). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| Image | IMAGE | — |