瑜瑾
文章5
标签6
分类4
python实现图片转字符画

python实现图片转字符画

简单通过python实现图片转字符画

库依赖

  • pillow

    pip install pillow

实现思路

字符画本质上是一系列字符的组合,如果我们将字符看作像素,不同的字符代表不同的颜色.因为最后输出的字符画是黑白的,所以首先应将图片黑白化

这里引入一下灰度值的概念灰度值:指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像。

利用下列公式将像素的rgb值转化为灰度值

gray = 0.2126 * r + 0.7152 * g + 0.0722 * b

用不同的字符代表不同的灰度值

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

代码实现

#-*- coding:utf-8 -*-  
from PIL import Image  

IMG='图片路径'  

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)  

效果展示

image-20200422195925980

日,好丑……