实验楼之"Python图片转字符画"
- Python 图片转字符画
- 实验环境
- Python 3.5
- pillow 5.1.0
- Python图像处理库:PIL库详解见 https://www.cnblogs.com/misswangxing/p/8144293.html
- 安装 pillow 库
$ sudo pip3 install --upgrade pip $ sudo pip3 install pillow
- 参考代码
# -*- coding=utf-8 -*- # argparse 库是用来管理命令行参数的 from PIL import Image import argparse # 构建命令行输入参数处理 ArgumentParser 实例 parser = argparse.ArgumentParser() # 定义输入文件、输出文件、输出字符画的宽和高 parser.add_argument('file') parser.add_argument('-o','--output') parser.add_argument('--width', type = int, default = 120) parser.add_argument('--height', type = int, default = 70) # 解析并获取参数 args = parser.parse_args() # 输入的图片文件路径 IMG = args.file # 输出字符画的宽、高和路径 WIDTH = args.width HEIGHT = args.height OUTPUT = args.output # 字符种类与数量可根据字符画效果进行调试 ascii_char = list("[email protected]%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ") # RGB值转字符的函数,alpha值为0时表示图片中该位置为空白 def get_char(r,g,b,alpha = 256): # 判断 alpha 值 if alpha == 0: return ' ' # 获取字符集的长度 length = len(ascii_char) # 将 RGB 值转换为灰度值 grey, 灰度值范围为 0-255 gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b) # 灰度值范围为0-255, 而字符集只有70 # 需要进行如下处理才能将灰度值映射到指定的字符上 unit = (256.0 + 1)/length # 返回灰度值对应的字符 return ascii_char[int(gray/unit)] # 若 ascii.py 被当作python模块import时,这部分代码不会被执行 if __name__ == '__main__': # 获取对象im, 使用PIL库中的resize()调整图片大小对应到输出字符画的宽度和高度 # Image.NEAREST表示输出低质量的图片 im = Image.open(IMG) im = im.resize((WIDTH,HEIGHT), Image.NEAREST) txt = "" for i in range(HEIGHT): for j in range(WIDTH): # 调用PIL库中的getpixel获取坐标位置的RGB像素值 # * 可以将元组作为参数传递给get_char函数中对应的每个参数 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)
- 成果示意图: