网上看的实验楼的教程,自己理解了一下。可还是觉得不好,因为不能复制,太傻了敲。就在自己电脑上运行。结果发现居然还要在CMD里启动。效果不理想
决定把它改良一下,太呆滞了,用命令行打开。而且效果和我差的有点远啊。
有空去网上找下,把它给修改一下。应该挺多的。洗澡去了;
太不友好了,CMD,就会一个CD和DIR ,最多加个IPCONFIG ,PING 一下。要求不要太高了
#!/usr/bin/env.python # _*_ coding: utf-8 _*_ from PIL import Image import argparse parse = argparse.ArgumentParser() parse.add_argument('file') parse.add_argument('-o','--output') parse.add_argument('--width',type= int ,default= 80) parse.add_argument('--height',type=int ,default= 80) args = parse.parse_args() IMG = args.file WIDTH =args.width HEIGHT = args.height OUTPUT = args.output ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^`'. ") # 获得字符串的颜色 def get_char(r,g,b,alpha = 256): if alpha == 0: return ' ' length = len(ascii_char) gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b) # 将RGB颜色赋值给灰度值,固定公式。灰度值公式将像素的 RGB 值映射到灰度值 unit = (256.0 + 1)/length return ascii_char[int(gray/unit)] 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))) #im.getpixel(()) 返回给定位置的像素值,这一点的RGB,三位数。然后用灰度值显示。 txt += ' ' print(txt) if OUTPUT: with open(OUTPUT,'w') as f: f.write(txt) else: with open(r"C:UsersHBXDocumentsstaudyoutput.txt",'w') as f: #输出文件到本地文件夹。 f.write(txt)
稍微改良版本:
#!/usr/bin/env.python # _*_ coding: utf-8 _*_ from PIL import Image #稍微改了一下,因为不想用CMD来解析。优化的不是很好。只能说勉强实现了。(其实是原来的图片太小了) # 主要是两点,一是获得长宽高,二是把文字赋予色彩。灰度值 # 原先的方法根据命令行下,获取。它的大小比较合适。用Image,总感觉太大了。发现是原来图片小 #获取图片的长宽高 def get_size(file): im = Image.open(file) #调用Image库打开文件 ,赋值im WIDTH = im.size[0] #获取宽,后面加[],猜测的,没想到真有这个 HEIGHT = im.size[1] #获取高 print(WIDTH,HEIGHT) #测试 return WIDTH ,HEIGHT # 返回高,宽 ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^`'. ") #70字符串 # 获得字符串的颜色 def get_char(r,g,b,alpha = 256): if alpha == 0: #RGB 等于0 return ' ' length = len(ascii_char) #获取字符串长度 gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b) # 将RGB颜色赋值给灰度值,固定公式。灰度值公式将像素的 RGB 值映射到灰度值 unit = (256.0 + 1)/length #把RGB 256除以字符串长度70,获得一个单位值 return ascii_char[int(gray/unit)] #灰度值除以基础单位。转整数。就将一个RGB分为了一个字符。 可以看做数学函数用70字符 个映射 256 RGB. if __name__== '__main__': file = r'C:UsersHBXPicturesCamera Rolldingdan.png' #打开文件 WIDTH, HEIGHT = get_size(file) # 获取长宽 im = Image.open(file) #调用 txt = "" for i in range(HEIGHT): #按照高宽循环。打印一张图片,前后无所谓。 for j in range(WIDTH): txt += get_char(*im.getpixel((j,i))) #im.getpixel(()) 返回给定位置的像素值,这一点的RGB,三位数。然后用灰度值显示。 txt += ' ' print(txt) # 打印测试看下 with open(r"C:UsersHBXDocumentsstaudyoutput.txt",'w') as f: #输出文件到本地文件夹。 f.write(txt)