Python 图片转字符画

简介

字符画是一系列字符的组合,可以把字符理解为像素,字符越多,代表的颜色越复杂,图片也更有层次感。

正文

那么彩色的图片怎么转换成黑白呢?这里我们需要先了解灰度值的概念

灰度值:指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像

灰度转换的公式如下:

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='/Users/huangdaju/Desktop/icon.png'

WIDTH = 60
HEIGHT = 45

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

def get_char(r,g,b,alpha=256):
    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) 

PIL 是一个 Python 图像处理库。是本篇文章重要的工具。

getpixel:返回指定位置的像素,如果所打开的图像是多层次的图片,那这个方法就返回一个元组。im.getpixel( xy ) => value or tuple。

txt += get_char(im.getpixel((j,i))) 这个函数,首先调用了im.getpixel函数,im.getpixel的参数是(j,i)。(j,i)其实是图片的横纵坐标。通过调用这个函数,把图片的横纵坐标上的颜色,分割成了(r,g,b,alpha)这个四个参数,然后调用get_char这个函数。 再说下get_char这个函数是怎么运行的。 def get_char(r,g,b,alpha = 256): if alpha == 0: //如果alpha等于0,也就是判断图片现在是没有的。 return ' ' length = len(ascii_char)//就是上边那一串字符串的长度

你可能感兴趣的:(Python 图片转字符画)