1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| from PIL import Image import argparse
#命令行输入参数处理 parser = argparse.ArgumentParser()
parser.add_argument('file') #输入文件 parser.add_argument('-o', '--output') #输出文件 parser.add_argument('--width', type = int, default = 80) #输出字符画宽 parser.add_argument('--height', type = int, default = 80) #输出字符画高
#获取参数 args = parser.parse_args()
IMG = args.file WIDTH = args.width HEIGHT = args.height OUTPUT = args.output
def strB2Q(ustring): """半角转全角""" rstring = "" for uchar in ustring: inside_code=ord(uchar) if inside_code == 32: #半角空格直接转化 inside_code = 12288 elif inside_code >= 32 and inside_code <= 126: #半角字符(除空格)根据关系转化 inside_code += 65248 rstring += chr(inside_code) return rstring
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
# 将256灰度映射到70个字符上 def get_char(r,b,g,alpha = 256): # 白色返回空 if alpha == 0: return ' ' length = len(ascii_char) #灰度值公式 gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b) #因为70个字符的数组下标范围是从0到69,如果不加1,灰度为256时会取下标为70,此时超出数组范围 unit = (256.0 + 1)/length return ascii_char[int(gray/unit)]
if __name__ == '__main__': #载入IMG的文件 im = Image.open(IMG) #重置或默认值 HEIGHT=int(WIDTH*im.size[1]/im.size[0]*0.55) 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)
|