"""Convert image to ASCII.""" from io import BytesIO from PIL import Image import boto3 client = boto3.client( 's3', endpoint_url='http://localstacks3:4566', use_ssl=False, aws_access_key_id='abc', aws_secret_access_key='123' ) # ascii conversion based on the following... # https://www.hackerearth.com/practice/notes/beautiful-python-a-simple-ascii-art-generator-from-images/ def handler(event, context): """Entrypoint.""" print(event) print(context) image_id = event['id'] bucket_id = event['bucket_id'] data = client.get_object( Bucket=bucket_id, Key=image_id ) body = data['Body'].read() raw_data = BytesIO(body) image = Image.open(raw_data) image_ascii = convert_image_to_ascii(image, 150) print(image_ascii) return { 'image': image_ascii } def convert_image_to_ascii(image, new_width): """Image to ASCII characters.""" image = scale_image(image, new_width) image = convert_to_grayscale(image) pixels_to_chars = map_pixels_to_ascii_chars(image) 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 scale_image(image, new_width): """Resize image.""" (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): """Grayscale image.""" return image.convert('L') def map_pixels_to_ascii_chars(image, range_width=25): """Convert pixels to ASCII.""" ascii_chars = ['#', '?', '%', '.', 'S', '+', '.', '*', ':', ',', '@'] 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)