A photograph,
made of characters and still a photograph

Every cell takes the character whose ink sits where the picture’s does — not the one with the same average — and a strong edge is drawn with the stroke that runs along it. Pictures and video, in your browser. È gratis. Davvero.

                                    \------/                                                                    \---@@@@@@%%---/                                                             \--@@@@@@@@@@%%##**-//                                                         \@@@@@@@@@@@@@%%##**+==/                                                      \-@@@@@@@@@@@@@%%###**+==-:.                                                    |@@@@@@@@@@@@%%%###**++=-::.                                                   \@@@@@@@@@@@%%%###***++=--:...                                                  |%%@@@@@%%%%%###***++==--:....                                                  |#%%%%%%%#####***++===-::.....                                                  //*#######****+++===--::......                                                   /-*******++++===---::.......                                                     /--=++======---::.........                                                       /--------::::.............                                                        -.........................                                                         .......................                                                              ..............                            
Matched by shape.
each glyph is split into sixteen zones and compared with the cell — `-` and `.` are not the same mark at the same tone
Edges drawn, not smeared.
where the picture turns, the cell takes / \ | or - along it
On the GPU.
four passes for a 4K frame, which is what makes video possible at all
Your own characters.
seven sets, or any string you type; duplicates are dropped and the rest measured
Text as well as picture.
PNG, SVG, plain text, ANSI colour for a terminal, and HTML
A snippet for your page.
a small script that does the conversion in the visitor’s browser

What it does

A picture, a video, and the characters behind them

The same engine draws the preview, writes the file and encodes every frame.

Pictures and video

What it reads

  • JPEG, PNG, WebP and AVIF
  • MP4 and MOV, with the sound carried over
  • Read in the browser, never sent anywhere
  • The grid follows the file’s own shape
Open
The match

How a character is chosen

  • Sixteen zones a glyph, compared against the cell
  • Not brightness alone, which is what makes it a fog
  • Edges take the stroke that runs along them
  • Any set of characters, measured as it is given
Open
What can be set

Width, tone and colour

  • 20 to 400 characters across
  • Auto levels, gamma, brightness, contrast
  • One ink, or every character in the picture’s colour
  • Inverted for a picture on a light ground
Open
What comes back

A picture or the text itself

  • PNG and JPG at the grid’s own size
  • SVG, with the characters as text
  • Plain text, or ANSI colour for a terminal
  • MP4, frame by frame, with the audio untouched
Open
Where it happens

On your machine

  • No upload, no account, no queue
  • WebGL2 for the picture, WebCodecs for video
  • Chromium browsers for video; the rest do stills
  • Nothing is stored between visits
Open

In detail

What it can do

The whole of it, without the sales copy.

01

Sources

What it takes.

  • JPEG, PNG, WebP, AVIF and GIF
  • MP4 and MOV with H.264
  • Any size; the grid is set in characters, not pixels
02

The match

How a cell becomes a character.

  • A 4 × 4 signature per glyph, measured from the face
  • A window of candidates around the cell’s own tone
  • Sobel edges, quantised into four strokes
  • A threshold for how strong an edge has to be
03

Out

What it writes.

  • PNG, JPG, SVG
  • TXT and ANSI (24-bit colour)
  • HTML, one span a colour run
  • MP4 at up to 4K, audio copied without re-encoding
04

For your page

The snippet.

  • A script of a few kilobytes, no dependencies
  • Point it at an image, a video or a camera
  • Your settings baked in
  • A plain-canvas port: close to the tool, not identical

How it works

Four steps

A file, a set of characters, a look, and the file back.

1

Drop the file

A picture or a video. It is read here and goes nowhere else.

2

Choose the characters

One of the sets, or your own. Each one is measured on the spot.

3

Set the look

Width in characters, tone, colour, and whether edges are drawn.

4

Take it away

A picture, the text, a video, or a snippet for your own page.

What it is for

Where characters say it better

The jobs this was built out of.

A header that is not a photograph

The same shot, reduced to characters, so a page keeps its type and loses its stock-photo look.

A terminal banner

ANSI colour, pasted into a README or printed by a script on start-up.

A video loop for a site

Every frame converted and re-encoded, with the sound carried across untouched.

Packaging that plays with type

A product photograph in the characters the pack is already set in.

A live component

The snippet does the conversion in the visitor’s browser — a camera, a video, or an image that changes later.

Something to print

SVG at the grid’s own size, so the characters stay text all the way to the plate.

Questions

The ones worth asking

Is my file uploaded anywhere?

No. It is read in the page, converted in the page and written from the page. There is no server in the path.

Why does it look better than the usual ASCII converter?

Because a glyph is chosen by where its ink sits, not by how much of it there is. Two characters can cover the same area and mean completely different shapes; matching on the average is what makes ordinary output look like fog.

What are the / \ | - for?

Edges. Where the picture turns sharply the cell takes the stroke that runs along the edge instead of a tone, which is what keeps an outline readable at a hundred characters across.

Which browsers can do video?

Chromium ones — Chrome, Edge, Arc, Brave — because video needs WebCodecs. Everywhere else the pictures work and the video is refused rather than half-done.

Does the snippet look exactly like the tool?

Close, not identical. It is a plain-canvas port: the same 4 × 4 match, edges taken from a coarser grid. It says so in its own header.

Can I use my own characters?

Any string at all. They are measured when you type them, so the order does not matter and duplicates are dropped.

How large can a picture be?

As large as you like — the grid is set in characters. A video is capped at 4K on the way out, which is as much as a browser encoder will take.

Turn it into characters

Free, right in your browser, with no sign-up.