DEV Community

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

Posted on

1

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]

Image of Docusign

Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs