首先要明确思路, 图片是由像素组成的, 不同的像素有不同的颜色(rgb), 那么既然我们要转化为字符画, 最直接的办法就是利用字符串来替代像素, 也就是用不同的字符串来代表不同的像素. 另外图片一般来讲是彩色的, 而acsii(一般打印在终端上吧) 都是黑白的, 此时就要介绍另外一个概念了 :
灰度值:指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像.
到这里思路就很明确了, 我们要做的就是两件事 :
1. 将每一个像素点(彩色图片用rgb)映射到每一个灰度值...
2. 将灰度值映射到每一个字符串...
所以我们还需要从像素点的rgb到灰度值的转换公式 : 灰度值 = 0.2126 * r + 0.7152 * g + 0.0722 * b.
代码如下 :
1 from PIL import Image 2 3 ascii_chars = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'.") #用来替代像素的字符集合... 4 5 def get_chars(r, g, b, alpha = 256): 6 global ascii_chars 7 if alpha == 0: 8 return ' ' 9 length = len(ascii_chars) 10 gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b) 11 unit = alpha / length #将256个像素均分给字符... 12 return ascii_chars[int(gray/unit)] 13 14 15 16 imagePath = "/Users/zhangzhimin/ascii_dora.png" 17 outPutHeight = 70 18 outPutWidth = 100 19 20 21 img = Image.open(imagePath) 22 img = img.resize((outPutWidth, outPutHeight)) 23 24 25 txt = "" 26 for y in range(outPutHeight): 27 for x in range(outPutWidth): 28 txt += get_chars(*img.getpixel((x, y))) 29 txt += '\n' 30 31 print(txt)
效果大概是这样的 :
值得一提的是只对一些层次简单的图形会有很好的效果, 如果想要解析复杂的图片建议增加字符串的个数以及显示屏的大小...
感谢实验楼提供这样一个有趣的编程练习...