ascii art generator
cat.jpg
text
ascii art generator
How does this work??
First, we need to understand that all colors are just numbers
These are RGB sensors (aka "cones") in the human eye. We have a few million of these, which is equivalent to "megapixels"
Inspired by...
the human eye!!!
artificial intelligence: "computer vision"
photobooth effects
SNAPCHAT!!!
scale_image(image, new_width=100) # resizes an image convert_to_grayscale(image) # converts image to grayscale map_pixels_to_ascii_chars(image, range_width=25) # maps each pixel to a character based on its number range. 0-255 is divided into 11 ranges of 25 pixels each convert_image_to_ascii(image, new_width=100)
# calls all of the functions above in a specific order, resulting in a string of characters handle_image_conversion(image_filepath) # calls convert_image_to_ascii (above) on the image file provided
import requests
from PIL import Image
ASCII_CHARS = [ '#', '?', '%', '.', 'S', '+', '.', '*', ':', ',', '@']
def scale_image(image, new_width=100):
# resizes an image, slightly adjusting the aspect ratio.
(original_width, original_height) = image.size
aspect_ratio = (original_height/float(original_width)) * .5
new_height = int(aspect_ratio * new_width)
new_image = image.resize((new_width, new_height))
return new_image
def convert_to_grayscale(image):
return image.convert('L')
def map_pixels_to_ascii_chars(image, range_width=25):
# maps each pixel to an ascii char based on the range in which it lies.
# 0-255 is divided into 11 ranges of 25 pixels each.
pixels_in_image = list(image.getdata())
pixels_to_chars = [ASCII_CHARS[pixel_value//range_width] for pixel_value in
pixels_in_image]
return "".join(pixels_to_chars)
def convert_image_to_ascii(image, new_width=100):
image = scale_image(image)
image = convert_to_grayscale(image)
pixels_to_chars = map_pixels_to_ascii_chars(image)
len_pixels_to_chars = len(pixels_to_chars)
image_ascii = [pixels_to_chars[index: index + new_width] for index in
range(0, len_pixels_to_chars, new_width)]
return "\n".join(image_ascii)
def handle_image_conversion(image_filepath):
image = None
try:
response = requests.get(image_filepath)
image = Image.open(BytesIO(response.content))
except Exception as e:
print("Unable to open image file {image_filepath}.".format(image_filepath=image_filepath))
print(e)
return
image_ascii = convert_image_to_ascii(image)
print(image_ascii)
image_file_path = "https://cdn.citylab.com/media/img/citylab/2018/02/RTR3MXS6/facebook.jpg?1518623597"
handle_image_conversion(image_file_path)