Python将图片转字符画
🚌 代码
from PIL import Image
import argparse
parser = argparse.ArgumentParser() #构建命令行输入参数处理 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() #从解析器获取参数集合赋值给args
IMG = args.file #根据参数名获取单个参数
WIDTH = args.width
HEIGHT = args.height
OUTPUT = args.output
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ") #用list()将字符串转化成列表,list()还可用来将元组转化为列表
def get_char(r,g,b,alpha = 256): #说明了alpha是默认参数
if alpha == 0: #判断透明度是否为0,为0说明像素看不见,于是返回空格
return ' '
length = len(ascii_char)
gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
unit = (256.0 + 1)/length #255+1应该也可以,要保证最后计算出来的索引最高是69
return ascii_char[int(gray/unit)]
if __name__ == '__main__':
im = Image.open(IMG) #使用图像前需先打开图像,并创建了名为im的对象
im = im.resize((WIDTH,HEIGHT),Image.NEAREST) #resize图像
txt = "" #初始化空字符串变量
for i in range(HEIGHT):
for j in range(WIDTH):
txt += get_char(*im.getpixel((j,i))) #调用im对象的getpixel(),返回像素的rgb值(元组形式),元组可能还包含alpha值,在列表或元组前加*号,会将列表或元组拆分成一个一个的独立元素,再传递参数。
txt += '\n'
print(txt)
if OUTPUT:
with open(OUTPUT,'w') as f:
f.write(txt)
else:
with open('output.txt','w') as f: #如果OUTPUT为空,则再当前目录新建output.txt并写入
f.write(txt)
🎳 知识点
if __name__ == '__main__'
: 用来判断当前的python文件是否直接作为脚本运行。因为python脚本运行方式有两种,一种是import到其它脚本文件中运行,一种是直接作为脚本运行。若是前者,python文件包含的内置变量name等于模块名称,main等于当前执行文件的名称;若是后者,name_等于当前执行文件的名称,而main也等于执行文件的名称,于是两者相等。
argparse模块:
- parser = argparse.ArgumentParser():创建ArgumentParser对象parser,ArgumentParser对象保存了所有必要的信息,用以将命令行参数解析为相应的python数据类型。
- parser.add_argument():向ArgumentParser对象添加命令行参数信息,这些信息告诉ArgumentParser对象如何处理命令行参数。
ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
- args = parser.parse_args():解析并获取ArgumentParser对象中保存的命令行参数。
程序执行流程:导入PIL argparse模块;获取命令行参数;创建要用到的字符列表;创建图像对象;遍历图像每行,调用get_char函数将每行的像素转换成对应字符,再将结果存入字符串变量txt;导出到文件。
使用灰度值公式将rgb值映射到灰度值:gray = 0.2126 r + 0.7152 g + 0.0722 * b(简化的 sRGB IEC61966-2.1 公式)
基本linux命令行的使用:sudo pip3 install --upgrade pip; sudo pip3 install pillow; cd; ls; touch; python3; vi;
打开output.txt时,最好修改 字体:宋体 字号:小六
附:代码来源——https://www.shiyanlou.com/courses/370/learning/
20190729