This is just a simple script that takes an image and renders it as a grid of ASCII characters in the console. The character chosen depends on the brightness of each pixel in the image: the following sequence (from densest (brightest) to least dense) is used:
$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`\'.
The rendered image contrast can be controlled (to some extent) by setting the value of the contrast
variable in the range -10 to +10. A default width of 100 characters is used can be passed as an optional command line argument after the original image filename, e.g.
python ascii-art.py girl-with-a-pearl-earring.png 120
The following images were produced from the files saturn.jpg and girl-with-a-pearl-earring.png.
import sys
import numpy as np
from PIL import Image
# Contrast on a scale -10 -> 10
contrast = 10
density = ('$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|'
'()1{}[]?-_+~<>i!lI;:,"^`\'. ')
density = density[:-11+contrast]
n = len(density)
img_name = sys.argv[1]
try:
width = int(sys.argv[2])
except IndexError:
# Default ASCII image width.
width = 100
# Read in the image, convert to greyscale.
img = Image.open(img_name)
img = img.convert('L')
# Resize the image as required.
orig_width, orig_height = img.size
r = orig_height / orig_width
# The ASCII character glyphs are taller than they are wide. Maintain the aspect
# ratio by reducing the image height.
height = int(width * r * 0.5)
img = img.resize((width, height), Image.ANTIALIAS)
# Now map the pixel brightness to the ASCII density glyphs.
arr = np.array(img)
for i in range(height):
for j in range(width):
p = arr[i,j]
k = int(np.floor(p/256 * n))
print(density[n-1-k], end='')
print()
Comments
Comments are pre-moderated. Please be patient and your comment will appear soon.
There are currently no comments
New Comment