图片转字符画
- 环境搭建
sudo apt-get install python3-pip
使用命令在linux安装pip工具,之后就可以使用pip工具安装python对应的包
sudo pip3 install pillow
使用该方法安装pillow包(用于图像处理的包)
使用如下公式可以将RGB值转换为灰度值
gray = 0.2126 * r + 0.7152 * g + 0.0722 * b
创建一个不重复的字符列表,灰度值小(暗)的用列表开头的符号,灰度值大(亮)的用列表末尾的符号
这样就形成了一个RGB到灰度到字符的映射
- 在linux创建文件
cd ./Lee touch ascii.py
vim ascii.py
使用cd更改目录,点号表示当前目录
使用touch在该目录创建文件
使用vim打开该文件
- 具体实现
argparse是专门用于处理命令行输入的模块,此处为parser这个实例定义了四个参数
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
定义了一个函数用于完成映射
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ") # 将256灰度映射到70个字符上 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) unit = (256.0 + 1)/length return ascii_char[int(gray/unit)]
if __name__ == '__main__': 代码块表示如果 ascii.py 被当作 python 模块 import 的时候,这部分代码不会被执行)
首先使用 PIL 的 Image.open 打开图片文件,获得对象 im
使用 PIL 库的 im.resize() 调整图片大小对应到输出的字符画的宽度和高度,注意这个函数第二个参数使用 Image.NEAREST,表示输出低质量的图片。
遍历提取图片中每行的像素的 RGB 值,调用 getchar 转成对应的字符
将所有的像素对应的字符拼接在一起成为一个字符串 txt
打印输出字符串 txt(txt就是显示出来的图片)
如果执行时配置了输出文件,将打开文件将 txt 输出到文件,如果没有,则默认输出到 output.txt 文件
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))) 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)
- 运行程序
wget https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png
使用wget 图片网址来获取文件,并下载到当前的工作目录
python3 ascii.py ascii_dora.png
格式为解释器 python文件 外部调用文件

浙公网安备 33010602011771号