# Python code to convert an image to ASCII image. import sys, random, argparse import numpy as np import math from PIL import Image, ImageFont, ImageDraw import gradio as gr # 70 levels of gray gscale1 = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. " # 10 levels of gray gscale2 = '@%#*+=-:. ' def getAverageL(image): """ Given PIL Image, return average value of grayscale value """ # get image as numpy array im = np.array(image) # get shape w,h = im.shape # get average return np.average(im.reshape(w*h)) def covertImageToAscii(input_img, cols, scale, moreLevels): """ Given Image and dims (rows, cols) returns an m*n list of Images """ # declare globals global gscale1, gscale2 # open image and convert to grayscale image = Image.fromarray(input_img).convert('L') # store dimensions W, H = image.size[0], image.size[1] print("input image dims: %d x %d" % (W, H)) # compute width of tile w = W/cols # compute tile height based on aspect ratio and scale h = w/scale # compute number of rows rows = int(H/h) print("cols: %d, rows: %d" % (cols, rows)) print("tile dims: %d x %d" % (w, h)) # check if image size is too small if cols > W or rows > H: print("Image too small for specified cols!") exit(0) # ascii image is a list of character strings aimg = [] # generate list of dimensions for j in range(rows): y1 = int(j*h) y2 = int((j+1)*h) # correct last tile if j == rows-1: y2 = H # append an empty string aimg.append("") for i in range(cols): # crop image to tile x1 = int(i*w) x2 = int((i+1)*w) # correct last tile if i == cols-1: x2 = W # crop image to extract tile img = image.crop((x1, y1, x2, y2)) # get average luminance avg = int(getAverageL(img)) # look up ascii char if moreLevels: gsval = gscale1[int((avg*69)/255)] else: gsval = gscale2[int((avg*9)/255)] # append ascii char to string aimg[j] += gsval # return txt image return aimg def sepia(input_img): aimg = covertImageToAscii(input_img, 200, 0.43, False) blank_image = Image.new(mode="RGB", size=(2000, 2000)) blank_image.save("blank_image.png") my_image = Image.open("blank_image.png") image_editable = ImageDraw.Draw(my_image) image_editable.text((400,400), "\n".join(aimg), (237, 230, 211)) return [my_image, "\n".join(aimg)] iface = gr.Interface(sepia, gr.inputs.Image(shape=(200, 200)), ["image", "text"], title = "ASCII Art", description = "Convert an image to ASCII art based on ascii character density. Copy and paste the text to a notepad to see it correctly") iface.launch()