ASCII Art Generator

Rebuild an image out of characters. Pick a glyph set and how many characters wide the result should be — every ramp is ordered by the ink each glyph actually covers in your browser's own font, measured when the page runs.

Drag & drop a file here, or

JPG PNG WebP GIF Max 50MB

The ramp is measured, not assumed

A glyph set is only a ramp if its characters really run light to dark, and that depends on the font your browser resolved. Each glyph is drawn once and its inked area counted, then the set is sorted by that number — so no order is claimed that this font does not have.

Character cells are not square

A monospace cell is roughly twice as tall as it is wide, so sampling square blocks and printing them as text stretches the picture. The ratio is read from the font's own advance width and line height, and the sampled block is shaped to match it. The figure is printed under the output.

100% private

Your image never leaves your device. The pixels are read on the Canvas API in your browser, the text is built locally, and the .txt and PNG downloads are generated on your machine. No upload, no storage, no account.

Advertisement

How it works

What the converter actually does

The image is divided into a grid as many columns wide as you ask for, the average brightness of each cell is measured, and one character is printed in that cell. That is the whole method: nothing is estimated and nothing is judged. The line under the output prints the parameters that produced it, including the two numbers this tool measures rather than assumes — the shape of a character cell in your font and the range of ink the chosen glyph set covers.

Why the ramp is measured in your browser

Almost every ASCII converter ships a ramp written as a fixed string, light to dark. That order belongs to whatever font its author was looking at, and it is not portable: a browser that resolves the monospace stack to a different face changes which glyph is darker than which, and the output still looks like ASCII art while the tones inside it are wrong. So the ramps here are declared as sets, not as orders. Each glyph is drawn once into its own cell, the alpha it puts down is summed, and the set is sorted by that measurement. Picking a glyph for a cell is then nearest-coverage, not position: real font glyphs are not evenly spaced in density, and indexing by position would claim they are.

Cell aspect, width and detail

A monospace character cell is about half as wide as it is tall, so a converter that samples square blocks produces a result stretched to roughly twice its proper height. The ratio is taken from the resolved font's own advance width and line height and the sampled block is shaped from it, which is why the figure under the output is a decimal rather than a round number. Output width is given in characters because that is the unit text is quoted in: forty characters reads as a coarse icon, a hundred is a good default, and two hundred and forty holds real detail but needs a wide screen or a small type size to be read as a picture. Nothing smaller than one cell can appear at all.

Where it runs, and what it is not

Everything happens in your browser through the Canvas API. The image is never uploaded, nothing is stored, and no account is needed. Two limits worth stating plainly. The coverage figures are not portable: they describe the font your browser resolved right now, so the same picture pasted into an editor with a different monospace face will not carry exactly the tones you saw here. And the darkest a cell can go is however much ink the densest glyph in the ramp covers — a ten-glyph ramp cannot reach solid black, which is why the block-element set exists. For the pixel-level version of the same reduction see Dithering, and for the printed-dot version see Halftone.

Frequently Asked Questions

Which glyph ramp should I pick?

The compact ten-glyph set is the classic one and reads well at any size. The seventy-glyph standard set gives the smoothest tonal steps and is worth the extra width when the output is large. Block elements are the only set here that can reach a solid fill, so they give the highest contrast and the least texture. Digits are a look rather than a tonal choice — eleven characters that happen to have similar weights, which is exactly why the ramp is sorted by measurement instead of by the order they are written in.

Why is the character order measured instead of just written down?

Because a written ramp is a claim about a font, and the font is not ours to choose. The page asks for a monospace face and the browser resolves that to whatever it has, which differs between Windows, macOS, Linux, iOS and Android. A ramp written for one of them can have two glyphs in the wrong order on another, and the result still looks like ASCII art while its midtones are wrong. Measuring each glyph when the page loads costs a few milliseconds and makes the order true for the font actually in use.

What is the ratio printed under the output?

It is the shape of one character cell in your font: its advance width divided by its line height, so roughly 0.5 in most monospace faces. The sampled block is shaped from that number, which is what stops the picture coming out stretched to twice its proper height. It is a decimal rather than a round figure because it is read from the font metrics rather than assumed.

Why does my ASCII art look stretched when I paste it somewhere else?

The output is shaped for the cell ratio of the font it was generated in. Paste it into an editor or a terminal whose font has a different ratio, or whose line spacing is looser, and the same characters occupy a differently shaped grid. Set the line height tight and use a standard monospace face and it will match. This is also why the PNG download exists: it is the same text drawn in the same font as the preview, so it carries its own proportions with it.

Can the output reach solid black?

Only with the block-element ramp, which includes a full block. Every other set has a densest glyph that still leaves paper showing — an at-sign covers well under half its cell — so the darkest tone in the picture comes out as that glyph and no darker. The range is printed under the output as a percentage pair so you can see the ceiling rather than discovering it. Inverting swaps which end of the range dark tones map to.

Does the colour option make it a different picture?

No. The glyph chosen for each cell is exactly the same either way, because it is chosen from brightness. Colour only paints the glyph in the average colour of the cell it came from, which is a display choice on top of the same conversion. The .txt download is plain characters and carries no colour at all; the PNG carries whatever the preview shows.

Does this upload my image anywhere?

No. The image is read into a canvas in your browser, the brightness of every cell is measured locally, and the text, the .txt file and the PNG are all built on your device. Nothing is sent to a server, nothing is stored, and no account is required.

What is the difference between this, dithering and halftone?

All three turn continuous tone into a pattern of discrete marks, and they differ in what the mark is. ASCII art uses one character per cell and picks it by how much ink that character covers. Dithering keeps every pixel and varies which pixels are on. A halftone uses a fixed grid and varies the size of one dot per cell, the way a printing press does. Our Dithering and Halftone tools cover the other two.