-
-
Save calmo/d408fba7f3e014932d809a86fab184b4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/python3 | |
| from PIL import Image | |
| 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[int(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) | |
| print(image_ascii) | |
| if __name__=='__main__': | |
| import sys | |
| image_file_path = sys.argv[1] | |
| handle_image_conversion(image_file_path) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment