1000 Python Questions
Get 1 Python question daily. Join this telegram channel https://t.me/python1000questions
Advertise with us
image script   1   4741
Python Script 13: Generating ascii code from Image

Adding a new script to the Python Script series. In this article we will see how to convert the colored image to ASCII art.


Dependecies:

You will need to install pillow python package. It is recommended that you create a virtual environment using python3 if not created already. 

Once virtual environment is activated use command pip install pillow to install the package.


Steps:

We are performing below actions to generate the ascii art from image.

- Get an image path as command line argument.
- Open the image from provided path.
- Calculate the aspect ratio.
- Resize the image. Here we are taking new width as 120 pixels. Adjusting the new height as per aspect ratio.
- Convert the image into greyscale format.
- Get all the pixels of image. Replace pixles with intentsity in a defined range with a character from list.
- Print image and save to text file.


Code:

import sys
from PIL import Image


# pass the image as command line argument
image_path = sys.argv[1]
img = Image.open(image_path)

# resize the image
width, height = img.size
aspect_ratio = height/width
new_width = 120
new_height = aspect_ratio * new_width * 0.55
img = img.resize((new_width, int(new_height)))
# new size of image
# print(img.size)

# convert image to greyscale format
img = img.convert('L')

pixels = img.getdata()

# replace each pixel with a character from array
chars = ["B","S","#","&","@","$","%","*","!",":","."]
new_pixels = [chars[pixel//25] for pixel in pixels]
new_pixels = ''.join(new_pixels)

# split string of chars into multiple strings of length equal to new width and create a list
new_pixels_count = len(new_pixels)
ascii_image = [new_pixels[index:index + new_width] for index in range(0, new_pixels_count, new_width)]
ascii_image = "\n".join(ascii_image)
print(ascii_image)

# write to a text file.
with open("ascii_image.txt", "w") as f:
    f.write(ascii_image)


If you are getting an elongated image in terminal, you can adjust the height accordingly. I am generating new_height using formula new_height = aspect_ratio * new_width * 0.55.

Statement list(img.getdata()) returns the list intensity of all pixels. Value of intensity will be between 0 to 255. Lower the value, darker the color. That is why we have characters in char list arranged from higher intensity to lower intensity. 

Value of pixel//25 , where 25 is the intensity range for one character, can be between 0 to 11 i.e why there are 11 characters in chars list. You may keep more characters in list, lets say 16 characters and then keep the range size as 17. 

Line new_pixels = [chars[pixel//25] for pixel in pixels] replaces the pixels with intensity from 0 to 25 with first character from chars list and 26 to 50 with seconds character from chars list and so on.

In the last lines we break the string into a matrix and print it.


How to use script:

To run the script use below command.

python3 script_name path_to_image
python3 image_to_ascii.py /home/Downloads/image.png


Code is available on Github.


References:

1. https://stackoverflow.com/questions/52307290/what-is-the-difference-between-images-in-p-and-l-mode-in-pil
2. https://pillow.readthedocs.io/







image script   1   4741

Related Articles:
How to compress the uploaded image before storing it in Django
Compressing an image in Django before storing it to the server, How to upload and compress and image in Django python, Reducing the size of an image in Django, Faster loading of Django template, Solving cannot write mode RGBA as JPEG error,...
Python Script 8: Validating Credit Card Number - Luhn's Algorithm
Validating credit card number using Luhn' Algorithm, Verifying Credit and Debit card using python script, Python code to validate the credit card number, Luhn' algorithm implementation in Python...
Python Script 5: How to find most popular technologies on Stackoverflow
How to find most popular technology on stackoverflow by crawling the stackoverflow site using python. Using python beautifulsoup to crawl web pages on stackoverflow. Python code to crawl stackoverflow, crawling stackoverflow for tags, python script to fetch data from stackoverflow....
Uploading a file to FTP server using Python
Uploading files to FTP server using Python, Python script to connect to ftp server, Python code to login to FTP server and upload file, How to connect to FTP server using python code, ftplib in python, Get server file listing using ftplib in python...

1 thought on 'Python Script 13: Generating Ascii Code From Image'
Ozzy :
Very interesting article
Admin :
Thank you for the feedback :)

Leave a comment:


*All Fields are mandatory. **Email Id will not be published publicly.

SUBSCRIBE
Please subscribe to get the latest articles in your mailbox.

© 2017-2020 Python Circle   Contact   Sponsor   Archive   Sitemap