The big-picture-level concept is simple:
-
Each printable character can be assigned an approximate gray-scale value; the “at” sign
@
obviously is visually darker than the “plus” sign+
, for example. The effect will vary, depending on the font and spacing actually used. -
Based on the proportions of the chosen font, group the input image into rectangular pixel blocks with constant width and height (e.g. a rectangle 4 pixels wide and 5 pixels high). Each such block will become one character in the output. (Using the pixel blocks just mentioned, a 240w-x-320h image would become 64 lines of 60 characters.)
-
Compute the average gray-scale value of each pixel block.
-
For each pixel block, select a character whose gray-scale value (from step 1) is a good approximation of the pixel block average (from step 3).
That’s the simplest form of the exercise. A more sophisticated version will also take the actual shapes of the characters into account when breaking ties among candidates for a pixel block. For example, a “slash” (/
) would be a better choice than a “backward slash” (\
) for a pixel block that appears to have a bottom-left-to-upper-right contrast feature.