ASCII art works by putting characters in a grid. That only produces a picture if every character occupies exactly the same width, which is true in a monospace font and false in a proportional one.
It is why a banner that looks perfect in a terminal turns into a jumble in an email: in a proportional font an M is roughly three times the width of an i, so every row ends up a different length.
Where it works and where it does not
| Works | Does not |
|---|---|
| Terminals and consoles | Email clients |
| Code comments | Word processors |
| README files | Most chat apps |
| Anything in a code block | Social media posts |
<pre> in HTML |
Regular HTML text |
The rule is simple: if the surrounding text is monospace, it will line up. Wrapping it in a code block is usually enough anywhere that supports them.
Two different things called ASCII art
Text as a banner, and an image as characters. They share a name and nothing else.
A banner uses a font where each letter is drawn from blocks — the FIGlet tradition, which goes back to the teletype era when the only way to make a heading in a plain text file was to type characters in the shape of letters. It survives in source file banners and terminal splash screens because plain text has no other way to emphasise anything.
Converting an image is a different technique: sample the picture, and choose a character for each cell based on how dark it is.
The correction most image converters miss
A character cell is about twice as tall as it is wide. Map one pixel to one character and the result is twice as tall as the original — everything stretched vertically, and it looks wrong in a way people often cannot name.
The fix is to sample half as many rows as columns. It is one line of arithmetic and it is the single most common omission in hand-written converters.
Choosing the ramp
The character ramp runs from dense to sparse — @%#*+=-:. is the classic, dark to light. Each character stands for a brightness band, which means the whole technique has about ten levels of grey to work with against the 256 in the original.
That is why high-contrast images with a clear subject convert well and busy ones become noise. A portrait against a plain background works at 80 characters wide; a landscape with detail everywhere does not work at any width.
Brightness should use the Rec. 601 luma weights rather than averaging red, green and blue. The eye is roughly six times more sensitive to green than to blue, so a flat average makes blue regions come out far lighter than they appear.
Questions people ask
Why does my art look like a negative? The default ramp assumes dark characters on a light background. Inverting it fixes a dark terminal.
What width should I use? Eighty characters is the traditional terminal width and a reasonable default. More detail needs more width and quickly stops fitting anywhere.
Can I use Unicode block characters? Yes, and █▓▒░ gives smoother gradients than punctuation. It stops being ASCII, which nobody minds.
Why are some letters missing from my banner? A block font covers a limited set. A good generator names what it dropped rather than substituting a question mark, which would read as part of the text.
The ASCII art generator makes banners from text, image to ASCII art converts a picture with the aspect correction applied, and the ASCII table covers the character set underneath it all.