当前位置 博文首页 > python实现图片转字符画的完整代码

    python实现图片转字符画的完整代码

    作者:FlyeWong 时间:2021-07-25 11:53

    前言

    最初是在实验楼看到的一个小实验

    实验楼-Python 图片转字符画

    原文是需要通过命令行运行程序

    这里改为直接运行,需要固定一些参数

    运行平台: Windows

    Python版本: Python3.6

    IDE: Sublime Text

    1、实验准备

    pillow库的安装

    pip install pillow
    
    
    

    2、实验原理

    字符画是一系列字符的组合,我们可以把字符看作是比较大块的像素,一个字符能表现一种颜色,字符的种类越多,可以表现的颜色也越多,图片也会更有层次感。

    最终显示的是黑白色的字符画,那么彩色的图片怎么转换成黑白的呢?这里就需要了解灰度值的概念了。

    <span style="font-size:16px;">灰度值:指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像。</span>

    我们利用下面的公式将像素的RGB值转换成灰度值:

    <span style="color:#ff0000;">gray = 0.2126 * r + 0.7152 * g + 0.0722 * b</span>

    用不同的字符代表不同的灰度值,字符的种类和数量可以根据自己需要的效果进行调整,最好从前往后可以看到明显的变化,最后一个字符为空格符最佳:

    ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")

    3、完整代码

    #-*- coding:utf-8 -*- 
    from PIL import Image 
     
    IMG='D:\Code\python\\test1\\ascii_dora.png' 
     
    WIDTH=60 
    HEIGHT=45 
     
    ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ") 
     
    #将256灰度映射到70个字符上 
    def get_char(r,g,b,alpha=256):#alpha透明度 
     if alpha==0: 
      return ' ' 
     length=len(ascii_char) 
     gray=int(0.2126*r+0.7152*g+0.0722*b)#计算灰度 
     unit=(256.0+1)/length 
     return ascii_char[int(gray/unit)]#不同的灰度对应着不同的字符 
     #通过灰度来区分色块 
     
    if __name__=='__main__': 
     im=Image.open(IMG) 
     im=im.resize((WIDTH,HEIGHT),Image.NEAREST) 
     txt="" 
     for i in range(HEIGHT): 
      for j in range(WIDTH): 
       txt+=get_char(*im.getpixel((j,i))) 
      txt+='\n' 
     
     print (txt) 
     #写入文件
     with open("output.txt",'w') as f: 
      f.write(txt) 
    

    4、结果

    总结

    jsjbwy