/TOOL · PHOTO TO ASCII ART

ASCII Art Maker: Create ASCII Art You Can Copy and Paste

Drop a photo, a picture or any image and it comes back as ASCII art: characters on a flat background, nothing showing through, real text you can select and copy. Set the width, ramp, contrast and character colour, then copy it or download it as .txt or PNG.

Sample image Drop an image anywhere on this panel, or paste one with Ctrl+V

        
0 x 0 characters 0 total 0 x 0 source pixels

Nothing is uploaded. The image is decoded and sampled by a canvas inside this page, so it never leaves your device. Load the page, disconnect from the network, and the converter still works. For per pixel colour taken from the photo, plus video, dither, halftone, pixel art and voxel, open the full ASCII Magic studio.

/HOW TO USE IT

Convert a photo to ASCII art in four steps

The whole thing takes under a minute, and the only setting most people ever change is the width.

  1. Load the image

    Drag a photo onto the converter, click Choose image, or paste one from the clipboard. It is decoded in the page, nothing is uploaded.

  2. Set the width

    Choose how many characters wide the output should be. Eighty to one hundred and twenty suits most uses, and the height follows the aspect ratio of the image.

  3. Tune the look

    Pick a character ramp, push contrast up if the result looks flat, choose a character colour, and set the background to black, white or transparent so the polarity matches where the art is going.

  4. Copy or download

    Copy the ASCII as text, download it as a .txt file, or export it as a PNG.

/THE RAMP

How brightness maps to a character ramp

The converter never looks at your picture as a picture. It lays a grid over it, one cell per character, and asks a single question of each cell: how bright is it, on a scale from black to white. That one number decides which character gets printed there.

Brightness is not the average of red, green and blue. Human vision weights green far more heavily than blue, so the standard luminance formula does the work instead: 0.2126 of the red channel, 0.7152 of the green, 0.0722 of the blue. A saturated green square and a saturated blue square with the same numeric value read as very different brightnesses to the eye, and averaging the channels would flatten them into the same character.

The character ramp is an ordered list sorted by how much of its cell each character fills. @ covers nearly the whole cell. % and # cover slightly less. + and = sit around the middle. : and . are almost nothing, and a space is nothing at all. Feed a brightness in, read a character out, print it, move to the next cell. That is the entire algorithm, and it has not changed since people were doing it on line printers in the 1960s.

The mapping flips depending on where the text is going to sit. As black text on white paper, the darkest part of the photo needs the heaviest character. As light text on a black background, the characters are the light, so the brightest part of the photo needs the heaviest character and the shadows need spaces. The background control above performs that flip for you, which is why black-background output pasted into a white document comes out looking like a negative. Switch the background to White before you copy, or use Invert if the negative is the point.

Ramp length is a taste decision more than a quality one. The seventy character ramp gives the smoothest gradients on paper and mush in practice, because so many of its characters are visually alike at small sizes. Ten levels reads as cleaner and more deliberate. Four levels turns a photograph into something closer to a poster print. Contrast usually matters more than ramp length: most photographs live in the middle of the brightness range, so pushing contrast up spreads them across more of the ramp and the result stops looking flat and grey.

RampCharactersLevelsBest for
Standard@%#*+=-:. 10Photographs, portraits, the safe default
Detailed$@B%8&WM#*oahkbdpq…70Large output where the extra steps are visible
Blocks█▓▒░ 5Logos, silhouettes, anything that needs even weight
Terminal@#o=-. 7README banners and CLI splash screens
Minimal#+. 4Poster prints and hard graphic looks
Binary10 3The code-rain look, high contrast sources only

/CHARACTER COLOUR

Choosing a colour for the characters

The Character colour control sets one colour for every character in the output. It is a single flat colour, not per pixel colour sampled from the photo, and that distinction is the whole design of this page: one colour keeps the result real selectable text rather than a picture of text.

Auto is the default and the safest choice, because it follows the background. On a black ground the characters come out white, on a white ground they come out black, so the art stays legible whichever way you flip the polarity. Change the background and Auto changes with it, which is one fewer thing to get wrong before you export.

The presets exist for the looks people actually ask for. Terminal green and amber are the phosphor colours of a CRT monitor and read as retro instantly, which is why they suit a CLI splash screen or a landing page hero. Cyan and magenta sit at the two ends of the synthwave palette and hold up well at small sizes because both are bright. Mint is the accent used across ASCII Magic. Black and white are there for when Auto is not what you want, usually because you are exporting a PNG that will sit on a background you have not chosen yet.

Custom takes any hex value, either from the swatch picker or by typing it into the field beside it. The two stay in sync, so you can paste a brand hex straight in. Anything you type in the three digit shorthand is expanded, and anything that is not a valid colour is ignored rather than applied, so the output never goes blank while you are half way through typing.

The one thing worth watching is contrast against the background. A dark colour on a black ground, or a pale one on white, produces output that is technically correct and completely unreadable. The converter checks the brightness distance between your colour and the ground and warns you under the control when the two are too close, but it does not stop you, because low contrast art on a transparent background is a legitimate thing to want.

Colour applies to the preview and to the PNG export, and it does not apply to the copied text or the .txt file. That is not a limitation of the tool, it is what plain text is: a .txt file stores characters and nothing else, so the art takes whatever colour the thing displaying it uses. If you need coloured characters in a document, paste the text and then set the text colour there, or wrap it in a <pre> element with a color rule. If you need the colour to travel with the art, export the PNG.

/MONOSPACE

Why monospace is not optional

ASCII art is a grid, and the grid is the only thing holding the picture together. Every character is assumed to occupy exactly the same width as every other one.

In a proportional font, i is roughly a third the width of M. A row full of thin characters comes out short, a row full of wide ones comes out long, and the picture shears apart line by line into noise. Nothing is wrong with the conversion when that happens. The font is wrong.

That is why a paste which looked perfect in the preview can fall apart the moment it lands somewhere else. Anywhere the text renders monospaced is safe: a terminal, a code block, a GitHub README inside a fence, a Discord or Slack message wrapped in triple backticks, a code comment, a plain text file, a CSS pre element. Anywhere the text renders in a normal interface font is not: a social post, an email body, a word processor document, a form field, a chat message without a code block. If the destination cannot be made monospaced, export the PNG instead and paste an image.

Line height matters just as much as character width. A monospaced character cell is roughly twice as tall as it is wide, so this converter samples about twice as many pixels vertically as horizontally for every cell to compensate. Get that ratio wrong and the output is a squashed or stretched version of the original, which is the single most common reason converted photos look subtly off. If you paste into a container with unusually tight or loose line spacing, the art will stretch to match, and the fix is the container's line height, not the conversion.

/WIDTH

Choosing an output width

Width is the only setting that changes the resolution of the result. Everything else changes its look. It is measured in characters rather than pixels, and it is the number of columns across, so the height follows from the aspect ratio of your image and you never set it yourself.

Under about 60 columns, only silhouettes survive. Faces stop being recognisable, logos lose their counters, and text inside the image is gone. That range is right for a small badge, a signature or an avatar, and wrong for anything with detail worth keeping.

Between 80 and 120 columns is where most output should live. Eighty is the width of a classic terminal and still the wrap column in plenty of code editors, so 80 columns drops into a README or a source file without wrapping. One hundred to one hundred and twenty is the comfortable maximum for something a person will read on a laptop screen.

Above 200 columns you are producing an image rather than text. It will not fit any normal text container, it wraps the instant it lands somewhere narrower, and it is really only useful when the destination is the PNG export or a print. Detail does keep improving up there, so if the plan is a poster, go wide and export the PNG.

The other constraint is the source. A conversion cannot invent detail that is not in the photo. Three hundred columns from a 200 pixel wide thumbnail just gives you a blurry thumbnail rendered in characters, at great length. Start from the largest version of the image you have.

/SOURCE IMAGES

What converts well, and what does not

Character art has one channel: brightness. You pick the colour the characters are drawn in, but the photo's own colours are gone, and with them everything you were relying on colour to communicate. That makes the choice of source image most of the work.

High contrast subjects survive. A face lit hard from one side, a silhouette against a bright sky, a logo, a building, a single object on a plain ground, anything whose shape already reads in black and white. Picture the photo in greyscale first, and if it still reads then, it will convert.

Busy subjects do not. Foliage, crowds, patterned fabric and fine repeating texture all collapse into an even grey mush, because every cell averages out to roughly the same value and the ramp has nothing left to distinguish. If you must convert something busy, raise the contrast hard and drop to a four or five level ramp so the mid tones are forced to pick a side.

Tight crops beat wide shots. A grid of 100 columns spends all 100 of them on whatever is in the frame, so a portrait cropped to the head keeps far more of the face than the same portrait at full length. Crop before you convert, not after.

/FAQ

Photo to ASCII art questions

How do I turn a photo into ASCII art without installing anything?
Drop the photo onto the converter at the top of this page and it comes back as ASCII text straight away, with no install, no sign up and no upload. Set the output width in characters, pick a character ramp, raise contrast if the result looks flat, choose a character colour, then copy the text or download it as a .txt file or a PNG. The whole thing runs in the browser tab you already have open.
How do I put ASCII art in a GitHub README without it breaking?
Wrap it in a fenced code block, three backticks on the line above and three on the line below. GitHub renders README body text in a proportional font where every character is a different width, so unfenced ASCII art shears apart row by row. Keep the output at 80 columns or fewer so it does not wrap inside the fence, and use the Standard or Blocks ramp, because the thinnest characters disappear at README font sizes.
Why does my ASCII art look crooked when I paste it into Discord?
Discord renders ordinary messages in a proportional font, so every row ends up a different physical length and the picture skews. Wrap the art in triple backticks to force Discord's monospaced code block, and keep it under about 60 columns so it does not wrap again on a phone. If it still will not sit straight, download the PNG and post that instead of the text.
Does this photo to ASCII converter upload my image anywhere?
No. The image is decoded and sampled by a canvas inside this page, so it never leaves your device. There is no server step, no queue and no account. You can load the page, disconnect from the network, and the converter still works.
Can I change the colour of the ASCII characters?
Yes. The Character colour control sets one colour for every character in the output. Pick Auto to follow the background, choose one of the presets, or type any hex value into the custom field. The colour shows in the preview and is baked into the PNG export. It does not travel with the copied text or the .txt file, because plain text carries no colour of its own, so paste those into somewhere you can set the text colour yourself.
Why does my ASCII art look like a photo negative?
Because the polarity follows the background you picked. On a black background the characters are the light, so the brightest part of the photo gets the heaviest character. On a white background the characters are the ink, so the darkest part gets the heaviest character. Copying black background output into a white document reverses it. Switch the background control to White before you copy, or turn on Invert to flip it deliberately.
Why does my photo turn into grey mush when I convert it to ASCII?
The tones in the photo are bunched in the middle of the brightness range, so nearly every cell lands on the same two or three characters. Raise Contrast to 150 or higher, nudge Brightness so the highlights stop short of clipping, and switch to a shorter ramp such as Minimal or Blocks that forces the mid tones to pick a side. Foliage, crowds and patterned fabric do this worst, so crop tighter before you convert.
Which character ramp works best for a portrait?
Standard, the ten level ramp, is the right default for a face. The seventy level Detailed ramp looks smoother on paper, but many of its characters are visually alike at small sizes, so it reads as mush unless the output is very wide. Blocks is the cleanest option for logos and silhouettes because its five levels are evenly weighted. Minimal, at four levels, turns a portrait into something closer to a poster print.
How wide should ASCII art be to fit in a terminal?
Eighty columns. That is the classic terminal width and still the wrap column in most code editors, so 80 drops into a README or a source file without wrapping. One hundred to one hundred and twenty is the comfortable maximum for something a person reads on a laptop. Below sixty columns only silhouettes survive. Above two hundred you are really producing an image rather than text, which is fine when the destination is the PNG export.
Why does my ASCII art look stretched or squashed?
A monospaced character cell is about twice as tall as it is wide, so the converter samples roughly twice as many pixels vertically as horizontally per cell to compensate. If the place you pasted into uses unusually tight or loose line spacing, that compensation no longer matches and the art stretches. The fix is the line height of the container, not the conversion: set it to about 1.2 and the proportions come back.
Can I convert an iPhone HEIC photo to ASCII art?
Only in Safari, which is the one browser that decodes HEIC natively. Chrome, Firefox and Edge will fail to load the file. Export the photo as JPG or PNG first, or open this page in Safari. Every other common format your browser can decode works, which in practice means PNG, JPG, WebP, GIF and AVIF, and an animated GIF converts its first frame.
How do I save ASCII art as an image instead of text?
Use Download PNG. It draws the finished characters onto a canvas at full size and saves it, using the background and the character colour you selected. Pick the None background first if you want transparent art to drop onto something else later. Download .txt saves the same output as plain text instead, and Copy as text puts it straight on your clipboard.
Can I keep the original photo colours in the ASCII art?
Not on this page. Here every character takes the one colour you choose, which is what keeps the output real text you can select and copy. For per pixel colour sampled from the photo itself, plus character blending, dither, halftone, pixel art, mosaic and voxel, open the full ASCII Magic studio.
Can I turn a video into ASCII art the same way?
Not on this page, which handles still images only. The full studio takes a video file and renders every frame through the same kind of character engine, then exports the result as an MP4 or a GIF, also without uploading anything.

/DO MORE WITH ASCII MAGIC

Plain characters are the start of it.

The studio behind this page keeps the colour, takes video as well as stills, and adds dither, halftone, pixel art, mosaic, LEGO and voxel on top. Export PNG, GIF or MP4, all in the browser.

Open the editor →

/RELATED

More ways to make things out of characters

This page converts one still image into plain text. To turn a word into a large banner, use the text to ASCII generator. For colour, video and the other 13 style engines, open the full studio, or browse all the tools.