转自实验楼:https://www.shiyanlou.com/courses/370/learning/?id=1191
代码:
# -*- coding:utf-8 -*- from PIL import Image import argparse #创建ArgumentParser实例 parser = argparse.ArgumentParser() #定义输入文件、输出文件、输出字符画的宽和高 parser.add_argument('file') #必选参数1 parser.add_argument('-o','--output') #可选参数2 parser.add_argument('--width',type=int,default=80) #可选参数3 parser.add_argument('--height',type=int,default=80) #可选参数4 #解析并获取参数 args = parser.parse_args() #输入的图片文件路径 IMG= args.file #输入字符画的宽度 WIDTH = args.width #输入字符画的高度 HEIGHT = args.height #输出字符画的路径 OUTPUT = args.output #首先将RGB值转为灰度值,然后使用灰度值映射到字符列表中的某个字符 ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ") def get_char(r,g,b,alpha=256): #判断alpha值 if alpha == 0: return ' ' #获取字符集的长度 length = len(ascii_char) #将RGB值转为gray,灰度值范围为0-255 gray = int(0.2126*r + 0.7152*g + 0.0722*b) #灰度值范围为0-255,而字符集只有70 #需要进行如下处理才能将灰度值映射到制定的字符上 uint = (256.0 + 1)/length #返回灰度值对应的字符 return ascii_char[int(gray/uint)] if __name__ == '__main__': #打开并调整图片的宽和高 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) #字符画输出到文件 if OUTPUT: with open(OUTPUT,'w') as f: f.write(txt) else: with open("output.txt",'w') as f: f.write(txt)
运行结果: