Hello all, in today’s quick tutorial I will show you a small Python script that converts image files into beautiful ASCII art.
This is our test image:
First we need to import our dependencies:
<span>import</span> <span>sys</span><span>from</span> <span>PIL</span> <span>import</span> <span>Image</span><span>from</span> <span>termcolor</span> <span>import</span> <span>colored</span><span>import</span> <span>colorama</span><span>import</span> <span>sys</span> <span>from</span> <span>PIL</span> <span>import</span> <span>Image</span> <span>from</span> <span>termcolor</span> <span>import</span> <span>colored</span> <span>import</span> <span>colorama</span>import sys from PIL import Image from termcolor import colored import colorama
Enter fullscreen mode Exit fullscreen mode
First we need to read our image:
<span>colorama</span><span>.</span><span>init</span><span>()</span><span>try</span><span>:</span><span>image_path</span> <span>=</span> <span>sys</span><span>.</span><span>argv</span><span>[</span><span>1</span><span>].</span><span>strip</span><span>(</span><span>'</span><span>-</span><span>'</span><span>)</span><span>except</span><span>:</span><span>image_path</span> <span>=</span> <span>input</span><span>(</span><span>'</span><span>test1.jpg</span><span>'</span><span>)</span><span>colorama</span><span>.</span><span>init</span><span>()</span> <span>try</span><span>:</span> <span>image_path</span> <span>=</span> <span>sys</span><span>.</span><span>argv</span><span>[</span><span>1</span><span>].</span><span>strip</span><span>(</span><span>'</span><span>-</span><span>'</span><span>)</span> <span>except</span><span>:</span> <span>image_path</span> <span>=</span> <span>input</span><span>(</span><span>'</span><span>test1.jpg</span><span>'</span><span>)</span>colorama.init() try: image_path = sys.argv[1].strip('-') except: image_path = input('test1.jpg')
Enter fullscreen mode Exit fullscreen mode
then we will be converting it into grayscale
<span>class</span> <span>AsciiArt</span><span>:</span><span>def</span> <span>__init__</span><span>(</span><span>self</span><span>,</span> <span>img_path</span><span>):</span><span>self</span><span>.</span><span>path</span> <span>=</span> <span>image_path</span><span>self</span><span>.</span><span>img</span> <span>=</span> <span>Image</span><span>.</span><span>open</span><span>(</span><span>self</span><span>.</span><span>path</span><span>)</span><span>def</span> <span>image</span><span>(</span><span>self</span><span>):</span><span>class</span> <span>AsciiArt</span><span>:</span> <span>def</span> <span>__init__</span><span>(</span><span>self</span><span>,</span> <span>img_path</span><span>):</span> <span>self</span><span>.</span><span>path</span> <span>=</span> <span>image_path</span> <span>self</span><span>.</span><span>img</span> <span>=</span> <span>Image</span><span>.</span><span>open</span><span>(</span><span>self</span><span>.</span><span>path</span><span>)</span> <span>def</span> <span>image</span><span>(</span><span>self</span><span>):</span>class AsciiArt: def __init__(self, img_path): self.path = image_path self.img = Image.open(self.path) def image(self):
Enter fullscreen mode Exit fullscreen mode
after that, we resize the image:
<span>width</span><span>,</span> <span>height</span> <span>=</span> <span>self</span><span>.</span><span>img</span><span>.</span><span>size</span><span>aspect_ratio</span> <span>=</span> <span>height</span><span>/</span><span>width</span><span>new_width</span> <span>=</span> <span>120</span><span>new_height</span> <span>=</span> <span>aspect_ratio</span> <span>*</span> <span>new_width</span> <span>*</span> <span>0.55</span><span>img</span> <span>=</span> <span>self</span><span>.</span><span>img</span><span>.</span><span>resize</span><span>((</span><span>new_width</span><span>,</span> <span>int</span><span>(</span><span>new_height</span><span>)))</span><span>width</span><span>,</span> <span>height</span> <span>=</span> <span>self</span><span>.</span><span>img</span><span>.</span><span>size</span> <span>aspect_ratio</span> <span>=</span> <span>height</span><span>/</span><span>width</span> <span>new_width</span> <span>=</span> <span>120</span> <span>new_height</span> <span>=</span> <span>aspect_ratio</span> <span>*</span> <span>new_width</span> <span>*</span> <span>0.55</span> <span>img</span> <span>=</span> <span>self</span><span>.</span><span>img</span><span>.</span><span>resize</span><span>((</span><span>new_width</span><span>,</span> <span>int</span><span>(</span><span>new_height</span><span>)))</span>width, height = self.img.size aspect_ratio = height/width new_width = 120 new_height = aspect_ratio * new_width * 0.55 img = self.img.resize((new_width, int(new_height)))
Enter fullscreen mode Exit fullscreen mode
new size of image, and we convert image to greyscale format
<span>img</span> <span>=</span> <span>img</span><span>.</span><span>convert</span><span>(</span><span>'</span><span>L</span><span>'</span><span>)</span><span>pixels</span> <span>=</span> <span>img</span><span>.</span><span>getdata</span><span>()</span><span>img</span> <span>=</span> <span>img</span><span>.</span><span>convert</span><span>(</span><span>'</span><span>L</span><span>'</span><span>)</span> <span>pixels</span> <span>=</span> <span>img</span><span>.</span><span>getdata</span><span>()</span>img = img.convert('L') pixels = img.getdata()
Enter fullscreen mode Exit fullscreen mode
replace each pixel with a character from array
<span>chars</span> <span>=</span> <span>[</span><span>"</span><span>B</span><span>"</span><span>,</span> <span>"</span><span>S</span><span>"</span><span>,</span> <span>"</span><span>#</span><span>"</span><span>,</span> <span>"</span><span>&</span><span>"</span><span>,</span> <span>"</span><span>@</span><span>"</span><span>,</span> <span>"</span><span>$</span><span>"</span><span>,</span> <span>"</span><span>%</span><span>"</span><span>,</span> <span>"</span><span>*</span><span>"</span><span>,</span> <span>"</span><span>!</span><span>"</span><span>,</span> <span>"</span><span>:</span><span>"</span><span>,</span> <span>"</span><span>.</span><span>"</span><span>]</span><span>new_pixels</span> <span>=</span> <span>[</span><span>chars</span><span>[</span><span>pixel</span><span>//</span><span>25</span><span>]</span> <span>for</span> <span>pixel</span> <span>in</span> <span>pixels</span><span>]</span><span>new_pixels</span> <span>=</span> <span>''</span><span>.</span><span>join</span><span>(</span><span>new_pixels</span><span>)</span><span>chars</span> <span>=</span> <span>[</span><span>"</span><span>B</span><span>"</span><span>,</span> <span>"</span><span>S</span><span>"</span><span>,</span> <span>"</span><span>#</span><span>"</span><span>,</span> <span>"</span><span>&</span><span>"</span><span>,</span> <span>"</span><span>@</span><span>"</span><span>,</span> <span>"</span><span>$</span><span>"</span><span>,</span> <span>"</span><span>%</span><span>"</span><span>,</span> <span>"</span><span>*</span><span>"</span><span>,</span> <span>"</span><span>!</span><span>"</span><span>,</span> <span>"</span><span>:</span><span>"</span><span>,</span> <span>"</span><span>.</span><span>"</span><span>]</span> <span>new_pixels</span> <span>=</span> <span>[</span><span>chars</span><span>[</span><span>pixel</span><span>//</span><span>25</span><span>]</span> <span>for</span> <span>pixel</span> <span>in</span> <span>pixels</span><span>]</span> <span>new_pixels</span> <span>=</span> <span>''</span><span>.</span><span>join</span><span>(</span><span>new_pixels</span><span>)</span>chars = ["B", "S", "#", "&", "@", "$", "%", "*", "!", ":", "."] new_pixels = [chars[pixel//25] for pixel in pixels] new_pixels = ''.join(new_pixels)
Enter fullscreen mode Exit fullscreen mode
split string of chars into multiple strings of length equal to new width and create a list
<span>new_pixels_count</span> <span>=</span> <span>len</span><span>(</span><span>new_pixels</span><span>)</span><span>ascii_image</span> <span>=</span> <span>[</span><span>new_pixels</span><span>[</span><span>index</span><span>:</span><span>index</span> <span>+</span> <span>new_width</span><span>]</span><span>for</span> <span>index</span> <span>in</span> <span>range</span><span>(</span><span>0</span><span>,</span> <span>new_pixels_count</span><span>,</span> <span>new_width</span><span>)]</span><span>ascii_image</span> <span>=</span> <span>"</span><span>\n</span><span>"</span><span>.</span><span>join</span><span>(</span><span>ascii_image</span><span>)</span><span>print</span><span>(</span><span>ascii_image</span><span>)</span><span>new_pixels_count</span> <span>=</span> <span>len</span><span>(</span><span>new_pixels</span><span>)</span> <span>ascii_image</span> <span>=</span> <span>[</span><span>new_pixels</span><span>[</span><span>index</span><span>:</span><span>index</span> <span>+</span> <span>new_width</span><span>]</span> <span>for</span> <span>index</span> <span>in</span> <span>range</span><span>(</span><span>0</span><span>,</span> <span>new_pixels_count</span><span>,</span> <span>new_width</span><span>)]</span> <span>ascii_image</span> <span>=</span> <span>"</span><span>\n</span><span>"</span><span>.</span><span>join</span><span>(</span><span>ascii_image</span><span>)</span> <span>print</span><span>(</span><span>ascii_image</span><span>)</span>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)
Enter fullscreen mode Exit fullscreen mode
write to a text file.
<span>file</span> <span>=</span> <span>"</span><span>ascii_image.txt</span><span>"</span><span>with</span> <span>open</span><span>(</span><span>file</span><span>,</span> <span>"</span><span>w</span><span>"</span><span>)</span> <span>as</span> <span>f</span><span>:</span><span>f</span><span>.</span><span>write</span><span>(</span><span>ascii_image</span><span>)</span><span>print</span><span>(</span><span>colored</span><span>(</span><span>f</span><span>"</span><span>saved art image to file as </span><span>{</span><span>file</span><span>}</span><span>"</span><span>,</span> <span>"</span><span>yellow</span><span>"</span><span>))</span><span>file</span> <span>=</span> <span>"</span><span>ascii_image.txt</span><span>"</span> <span>with</span> <span>open</span><span>(</span><span>file</span><span>,</span> <span>"</span><span>w</span><span>"</span><span>)</span> <span>as</span> <span>f</span><span>:</span> <span>f</span><span>.</span><span>write</span><span>(</span><span>ascii_image</span><span>)</span> <span>print</span><span>(</span><span>colored</span><span>(</span><span>f</span><span>"</span><span>saved art image to file as </span><span>{</span><span>file</span><span>}</span><span>"</span><span>,</span> <span>"</span><span>yellow</span><span>"</span><span>))</span>file = "ascii_image.txt" with open(file, "w") as f: f.write(ascii_image) print(colored(f"saved art image to file as {file}", "yellow"))
Enter fullscreen mode Exit fullscreen mode
Last step:
<span>if</span> <span>__name__</span> <span>==</span> <span>"</span><span>__main__</span><span>"</span><span>:</span><span>AsciiArt</span><span>(</span><span>image_path</span><span>).</span><span>image</span><span>()</span><span>if</span> <span>__name__</span> <span>==</span> <span>"</span><span>__main__</span><span>"</span><span>:</span> <span>AsciiArt</span><span>(</span><span>image_path</span><span>).</span><span>image</span><span>()</span>if __name__ == "__main__": AsciiArt(image_path).image()
Enter fullscreen mode Exit fullscreen mode
This is our final result –
Thank you all.
暂无评论内容