DEV Community

Cover image for Bring Your Images to Life : A Guide to Python-Based ASCII Art 🐍
Saif Matab
Saif Matab

Posted on

Bring Your Images to Life : A Guide to Python-Based ASCII Art 🐍

Have you ever encountered those captivating images crafted entirely from text characters? That's the magic of ASCII art, a creative method for representing visual information using text. This article delves into Python code that empowers you to transform your favorite images into this unique format.

Understanding the Code

  • We'll be working with Python and the Pillow library (often shortened to PIL) for image manipulation. Here's a breakdown of the essential functions:

1.Resizing Images (resize_img):

def resize_img(image, new_width=100):
     width, height = image.size
     ratio = height / width
     new_height = int(new_width * ratio)
     resized_img = image.resize((new_width, new_height))
     return resized_img
Enter fullscreen mode Exit fullscreen mode
  • This function receives an image and an optional new desired width.
  • It calculates the proportional height based on the original aspect ratio to maintain proportions during resizing.

2.Converting to Grayscale(pixel_to_grayscale):

def pixel_to_grayscale(image):
  grayscale_img = image.convert("L")  # "L" mode for grayscale
  return grayscale_img
Enter fullscreen mode Exit fullscreen mode
  • This function converts the image from its original colors to grayscale.
  • Grayscale representations simplify the process of mapping pixel brightness levels to ASCII characters later

3.Converting Pixels to ASCII(pixel_to_ascii):

def pixel_to_ascii(image):
  pixels = image.getdata()
  characters = "".join(ASCII_CHAR[pixel // 25] for pixel in pixels)
  return characters

ASCII_CHAR = ["@", "#", "S", "%", "?", "*", "+", ";", ":", ",", "."]
Enter fullscreen mode Exit fullscreen mode
  • This function is the core of the conversion.
  • It iterates through each pixel in the grayscale image and assigns a corresponding ASCII character based on its brightness.
  • The ASCII_CHAR list acts as a reference, with darker characters representing darker pixels for a textured effect.

4.Main Function (main):

def main(new_width=100):
  path = input("Enter the path of the image: \n")
  try:
    image = Image.open(path)
  except Exception as e:
    print(f"{path} is not a valid path!")
    print(e)
    return

  # Convert to grayscale and ASCII art
  grayscale_image = pixel_to_grayscale(resize_img(image))
  new_image_data = pixel_to_ascii(grayscale_image)

  pixel_nb = len(new_image_data)
  ascii_img = "\n".join(new_image_data[i:i + new_width] for i in range(0, pixel_nb, new_width))

  print(ascii_img)  # Print the ASCII art to the console

  try:
    with open("asciiArt.txt", "w") as c:
      try:
        c.write(ascii_img)
      except Exception as e:
        print(f"Error while writing to the file: {e}")
  except Exception as e:
    print(f"Error while opening the file: {e}")

main()
Enter fullscreen mode Exit fullscreen mode
  • This function brings everything together.
  • It prompts the user for an image path, handles potential exceptions, and sequentially calls other functions: Resizes the image.
  • Converts it to grayscale.
  • Converts pixels to ASCII characters.
  • Prints the ASCII art to the console.
  • Attempts to save the ASCII art to a text file named “asciiArt.txt”

Explore the full code and contribute here: [https://github.com/Kernel-rb/Image2ASCII]

Top comments (0)