python实现图片转字符画

字符画,就是一系列字符的组合,组成的形状是一幅可识别的图画


原理:
每一张彩色的图片,之所以能够呈现出colorful或者dim的画面,是因为每一张图都由很多个像素点组成,而每一个像素点都有不同的颜色,而这个颜色就由三个值(rgb)对应三原色的百分比构成,所以每一个像素点都有三个值(rgb,范围0-255),我们可以将每一个像素点转换成一个字符来形成字符图画
灰度值:指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像
rgb转换成灰度值公式:gray=int(r0.299+g0.587+b0.114)
通过这个公式可以将256
256*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 += '\n'
	print(txt)   #打印出字符画
	with open("C:/Users/Vincent/Desktop/3.txt",'w') as f:
		f.write(txt)

 posted on 2020-05-19 10:43  My_serendipity  阅读(770)  评论(0编辑  收藏  举报