~/tool · image to ascii

Image to ASCII converter

Drop a photo and copy plain-text ASCII. Tune it live; nothing leaves this tab or gets uploaded.

$ semaphore --charset detailed --cols 120 --color green
$ ~/output — waiting for source – □ ✕
[ what_the_controls_do ]

Every control, and when to move it

The converter samples your image on a local canvas, reduces each grid cell to one perceptual brightness value, and picks the character whose ink coverage is closest. Everything below changes either how the grid is measured or which characters it can choose from. Nothing is uploaded at any point, so the whole loop runs at the speed of your own machine.

converter controls, with the range each one accepts
controlrangedefaultwhat it changes
charset 6 presets detailed Which characters the output may use. This is the single biggest lever on how the result reads — see the comparison on the home page.
columns 40–240 120 Width of the output grid in characters. Row count follows from it and the source proportions, so this alone sets the resolution.
brightness -100 … +100 0 Shifts every cell along the ramp before a character is chosen. Raise it when a dark photo collapses into solid ink.
contrast -100 … +100 0 Spreads mid-tones apart. The usual fix when an image converts to visual mush: the ramp is being used, but only its middle.
invert on / off off Flips the ramp. Off assumes light characters on a dark ground; turn it on when the output is destined for a white page.
dither on / off on Braille only. Applies Floyd–Steinberg error diffusion so each of the eight dots per cell is decided against its neighbours rather than in isolation.
color green · gray · original green Affects the on-screen render and the PNG export only. Clipboard and .txt output are always plain characters.

$ cells are not square

A monospace cell is about three parts wide to five parts tall, so the converter emits roughly three rows for every five columns. At 120 columns a square photo comes out 72 rows deep. Paste into a font with different metrics and the picture stretches — the characters are right, the grid is not.

$ columns beat every other setting

A sixty-eight step ramp needs enough characters before its shades read as shading. Below about sixty columns the detailed ramp turns to speckle and a shorter one — minimal or blocks — will hold the shape better than any amount of contrast.

$ what leaves the tab

Nothing. Production ships connect-src 'none', so the page cannot open a fetch, XHR or WebSocket even if its code tried. Only your charset and color choice are remembered on the device; image bytes never are. See privacy.