Convert images to ASCII text art with the ramp measured rather than assumed: each glyph is drawn and its ink counted, the character cell is measured in the font used, and brightness is a named definition.
Initializing in your browser…
Turn an image into a data URL whose payload is decoded again and compared byte for byte with the file, with the media type taken from the file's own signature rather than its extension and the size cost of embedding stated in full.
Caption a picture with text that is measured, wrapped and kept inside the frame. The preview canvas is the exported file, pixel for pixel.
Read text off a picture with Tesseract, after preparation that measures the type and enlarges it: 8px text went from a 53 percent character error rate to 8. Every word carries a confidence and a box drawn on the picture.
The classic ASCII ramp, checked in the font the art is drawn in.
Ramp
.:-=+*#%@
Ink per character, percent of a cell
0.00 . 2.23 : 3.65 - 2.96 = 6.02 + 5.44 * 7.56 # 11.90 % 10.16 @ 14.03 Not monotonic: 3 of 9 neighbouring pairs go the wrong way. Measured order: .-:+=*%#@
A ramp is a claim that this glyph is darker than that one, and it is decidable: draw each glyph and count the alpha it covers. The famous ramp goes backwards three times in this font. The page names the pairs and offers the measured order rather than repeating the claim.
Turn a picture into characters, with the parts that are usually guessed measured instead. Each ramp is checked by drawing its glyphs and counting the ink, the character cell is measured in the font the art is shown in, and brightness is a named definition rather than a flat average of the three channels.
Produce art at a column count that fits, with a ramp whose order has been checked in the font it will be read in.
Convert a cut-out without the transparent ground becoming a solid block of the darkest character.
Switch to a light theme and the ramp flips, so the picture is a positive rather than a negative.
A character ramp is a claim that this glyph is darker than that one, and it is decidable: draw each glyph in the font the art will be shown in and count the alpha it covers. This tool measures every ramp that way and prints the figure per character, so "runs from light to dark" is a number rather than a hope. The measurement is not flattering to the classic ramp. In the monospace stack this page uses, " .:-=+*#%@" measures 0.00, 2.23, 3.65, 2.96, 6.02, 5.44, 7.56, 11.90, 10.16 and 14.03 percent of a cell, which means it goes backwards three times: a colon draws more ink than a hyphen, an equals more than a plus, and a hash more than a percent. The page names each inverted pair, shows the measured order (" .-:+=*%#@"), and offers a button that adopts it. The Braille ramp the tool used to ship went backwards six times and is replaced; so is the star ramp, which put a hollow star after a filled one twice.
The row count follows from a second measurement. A monospace cell is taller than it is wide, so fewer rows than columns are sampled, and the tool used to hardcode a correction of 0.5. The real ratio is the advance width over the line height, which at the default 10px size and a line height of 1.00 is 6.021 over 10.00, that is 0.6021: the art was coming out at 83.0 percent of its correct height, so a square picture rendered 480 pixels wide and 400 tall. It is now measured, a square picture renders square, and the panel prints both numbers.
Brightness is a named definition rather than an unnamed average. The old code used (r + g + b) / 3, which puts pure red, pure green and pure blue all at 85; ITU-R BT.709-6 puts them at 54, 182 and 18, which is 97 levels out on green. Four definitions are offered with the document each comes from (Rec. 709, Rec. 601, CIE lightness, and the flat average kept so the difference can be seen), and on a fixture of four solid blocks the flat average draws two distinct characters where Rec. 709 draws four. Transparency is handled explicitly: a canvas hands a fully transparent pixel back as BLACK, so a logo on transparency used to become a solid field of the darkest character, and the transparent cells are now counted and mapped to whichever end of the ramp you choose, or to a literal space.
Two more arithmetic faults are gone. The ramp is split into code POINTS rather than UTF-16 code units, so the emoji ramp is the six squares it looks like rather than ten positions of which eight are half a surrogate pair; sixteen sampled levels through the old code produced five lone surrogates, which become U+FFFD the moment the text is saved. And the level-to-character mapping divides the 256 levels evenly: the old floor(v / 255 * (n - 1)) gave the last character of a ten-step ramp exactly ONE level of 256, so the darkest glyph was drawn only for a pixel of pure white. Down-sampling goes through the shared resampler with the filter named, so every source pixel that lands in a character cell is averaged rather than one being picked out of each. The preview, the HTML export and the PNG export all use the same font stack and the same measured advance width, where the old exports used Courier New and a guessed fontSize * 0.6 respectively, so all three are now the same picture.
By measurement. Every glyph in the ramp is drawn on a 64 by 64 cell in the same font stack the art uses and the alpha it covers is summed, so a partly covered pixel at the edge of a stroke counts as exactly its coverage. The brightness of each sampled cell then picks a character by an even division of the 256 levels.
Because it measured it. The classic " .:-=+*#%@" ramp goes backwards three times in this font: a colon draws more ink than a hyphen, an equals more than a plus, and a hash more than a percent. The page names the pairs and offers the measured order; the classic ramp is kept as the default because it is what people expect.
The row count depends on the shape of a character cell, and it used to be a hardcoded 0.5. The measured ratio in this font at the default size is 0.6021, so the art was 83.0 percent of its correct height. It is measured now.
The output is text arranged by your input image. There are no restrictions from the tool itself, only whatever rights the source image carries.
Images are decoded, edited, and exported entirely inside this browser tab. No originals, exports, or metadata are uploaded.