参考代码
# -*- 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)