Thrasos Website

Sometimes I write about tech and code, and sometimes I don't.

Menu
  • Home
  • About
Menu

ASCII ART

Posted on August 13, 2020August 13, 2020 by thrasos

Generating ASCII art from images using Python3 and PIL (Python Image Library)

pip install Pillow
from PIL import Image
import os

ASCII_CHARS = [ '#', '?', '%', '.', 'S', '+', '.', '*', ':', ',', '@']

def scale_image(image, new_width=100):
    """Resizes an image preserving the aspect ratio.
    """
    (original_width, original_height) = image.size
    aspect_ratio = original_height/float(original_width)
    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:
        image = Image.open(image_filepath)
    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)
    f = open(os.path.splitext(image_filepath)[0]+'.txt','w')
    f.write(image_ascii)
    f.close()

if __name__=='__main__':
    import sys

    image_file_path = 'your_path/to_your_image/goes_here.png'
    handle_image_conversion(image_file_path)
Category: blog

Post navigation

← Game of Life
Kerkhoffs principle →
  • GitHub
  • LinkedIn
  • Twitter
  • Telegram
  • Music with the Phone’s Keypad – Tetris – Part 2May 14, 2023
  • Cleaning up VCARD contacts without a phone.January 29, 2023
  • Docker Compose Notes #2December 15, 2022
  • Docker Notes #1December 14, 2022
  • A.I generated poem in GreekDecember 11, 2022
  • A.I. Generated ArtDecember 10, 2022
  • A.I. generated art.December 9, 2022
  • MailCow, simple html in maindomainSeptember 10, 2022
  • CamouflageFebruary 1, 2022
  • Kerkhoffs principleNovember 16, 2020
© 2023 Thrasos Website | Powered by Minimalist Blog WordPress Theme