Create Ascii art with Python

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:

图片[1]-Create Ascii art with Python - 拾光赋-拾光赋
Let’s jump to the code:

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.

原文链接:Create Ascii art with Python

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
Real dream is the other shore of reality.
真正的梦就是现实的彼岸
评论 抢沙发

请登录后发表评论

    暂无评论内容