首先要明確思路, 圖片是由像素組成的, 不同的像素有不同的顏色(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)
效果大概是這樣的 :
值得一提的是只對一些層次簡單的圖形會有很好的效果, 如果想要解析復雜的圖片建議增加字符串的個數以及顯示屏的大小...
感謝實驗樓提供這樣一個有趣的編程練習...