python实现图片转字符画
字符画,就是一系列字符的组合,组成的形状是一幅可识别的图画
原理:
每一张彩色的图片,之所以能够呈现出colorful或者dim的画面,是因为每一张图都由很多个像素点组成,而每一个像素点都有不同的颜色,而这个颜色就由三个值(rgb)对应三原色的百分比构成,所以每一个像素点都有三个值(rgb,范围0-255),我们可以将每一个像素点转换成一个字符来形成字符图画
灰度值:指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像
rgb转换成灰度值公式:gray=int(r0.299+g0.587+b0.114)
通过这个公式可以将256256*256的范围减少到0-255,同样,也没有256个单色字符去一一对应范围啊,这个时候可以灵活变通,将两到三个灰度值对应为一种字符
再具体的原理就不再进行过多解释
要实现图片转字符画功能,需要一个第三方图像处理库PIL(Python Image Library)
实现字符画所需要的字符集(共70个)
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^`'. ")
from PIL import Image #PIL是python的图像处理库
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^`'.")
WIDTH = 60
HEIGHT = 45
#设置字符画的宽高
#将256个灰度映射到70个字符上,也就是RGB转字符
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__':
img = 'D:/python/cat.png' #图片所在位置(反斜杠)
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 += '
'
print(txt) #打印出字符画
with open("C:/Users/Vincent/Desktop/3.txt",'w') as f:
f.write(txt)