字符画,是一系列字符的组合,我们可以把每个字符看成是一个大的像素,一个字符可以代表一种颜色,字符各类越多,可体现的颜色越多,字符画就更有层次感。
灰度值,指黑白图像中点的颜色的深度,范围是0-255,白色为255,黑色为0。
RGB,是红绿蓝三颜色,通过不同的叠加可得到其他颜色。
图片转字符画原理,先定义一个字符集用来和灰度值做映射,将图片每个像素的RGB值转换为一个灰度值,将其对应的字符输出就得到字符画。
RGB转灰度值,有个心理学公式,在网上搜一下我们使用下面这个公式
gray = (2126 * r + 7152 * g + 722 * b) / 10000
# 1. 我们用到的是Python3,确保有Python3的环境 python3 -V # 2. 安装Python图象处理库pillow(PIL) pip install --upgrade pip pip install pillow
ascii.py
#!/usr/bin/python3 #coding: utf-8 from PIL import Image # ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ") ascii_char = list('MNHQ$OC?7>!:–;. ') def get_char(r, g, b, alpha=256): if alpha == 0: return ' ' # 这是一个优化,将浮点运算转成整型运算 gray = (2126 * r + 7152 * g + 722 * b) / 10000 # 为什么是1.0 因为alpha、gray是整型运算的时候按整型算如果小于1的话按0算 char_idx = int((gray / (alpha + 1.0)) * len(ascii_char)) return ascii_char[char_idx] def write_file(out_file_name, content): with open(out_file_name, 'w') as f: f.write(content) def main(file_name="test.jpg", width=100, height=80, out_file_name='output.txt'): text = '' im = Image.open(file_name) im = im.resize((width, height), Image.NEAREST) for i in range(height): for j in range(width): text += get_char(*im.getpixel((j, i))) text += '\n' print(text) write_file(out_file_name, text) if __name__ == '__main__': main('dora.png')
# 1. 准备图片dora.png # 2. 执行命令 python3 ascii.py
MMH$$$NM MQ7777> $N OM O7777777 C 77OM C77777777 > Q: $777M 77777777$>Q 7O$O Q$ M?777777N N O H .N >N?> 777777N :N: >QQQQ H N77777 MN .:???? M77777? ;:???QQQQ! H H7777H ! !HO; C7777 QQQQQHNNHNM$> : O C7777 QQQQQQQQQQQQQQQQQQQQQO ? $7777 QQQQQQQQQQQQQQQQQQQQ$ M M7777 CQHNC?$MHQQQQQQQQQQM – ?777 ?77777777?QQQQQQQ? M M777N $777777777MQQQH– ? ?777! .777777777QQH ! C777 ?O777777N! : ?77?– .!QQMMMMMH$M O777NNQQQQQ Q–QCMNM NQQNQ7777H Q;;;; M 77777777C O;;;C ? 777777777O > H?? ?777777Q! ;HO: ;H MC:N H7O$777$ : ?M M M777777H ? N Q ?77777? : ; Q QQQMH777777C .?Q?: H M QQQM$7777777Q Q7? M77777777777QQ?NO777H M M7777777777777777$MM N ; M N77777777777OM C7777777HM 77777QM 7QM ; O M$?OM