今天用少量的代码做一个小小的效果,先上效果图
这个就是我们今天要实现的内容,将图片转换成字符画的操作。
知识要点
- 熟悉Linux命令操作
- Python基础
- pillow库
- argparse库(参考链接)
实验环境
- python3
- pillow
PIL 是一个 Python 图像处理库,是本课程使用的重要工具,window下使用命令来安装 pillow(PIL)库:
pip install pillow
实验操作
- 概念
字符画:字符画是一系列字符的组合,我们可以把字符看作是比较大块的像素,一个字符能表现一种颜色(为了简化可以这么理解),字符的种类越多,可以表现的颜色也越多,图片也会更有层次感。
灰度值:指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像。
RGB模式:是工业界的一种颜色标准,是通过对红®、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一
- 步骤
-
导入相对应的库
from PIL import Image import argparse
-
根据参数 argparse 处理命令行参数,获取输入的图片路径以及输出字符画的宽、高以及输出文件的路径
# 首先,构建命令行输入参数处理 ArgumentParser 实例 parser = argparse.ArgumentParser() # 定义输入文件、输出文件、输出字符画的宽和高 parser.add_argument('file') #输入文件 parser.add_argument('-o', '--output') #输出文件 parser.add_argument('--width', type = int, default = 40) #输出字符画宽 parser.add_argument('--height', type = int, default = 20) #输出字符画高 # 解析并获取参数 args = parser.parse_args() # 输入的图片文件路径 IMG = args.file # 输出字符画的宽度 WIDTH = args.width # 输出字符画的高度 HEIGHT = args.height # 输出字符画的路径 OUTPUT = args.output
-
将RGB 值转为灰度值,然后使用灰度值映射到字符列表中的某个字符
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
def get_char(r,g,b,alpha = 256): # 判断 alpha 值 if alpha == 0: return ' ' # 获取字符集的长度,这里为 70 length = len(ascii_char) # 将 RGB 值转为灰度值 gray,灰度值范围为 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)]
-
处理图片,获取我们所需要的字符画
if __name__ == '__main__': # 打开并调整图片的宽和高 im = Image.open(IMG) im = im.convert('RGB') im = im.resize((WIDTH,HEIGHT), Image.NEAREST) # 初始化输出的字符串 txt = "" # 遍历图片中的每一行 for i in range(HEIGHT): # 遍历该行中的每一列 for j in range(WIDTH): # 将 (j,i) 坐标的 RGB 像素转为字符后添加到 txt 字符串 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)
完整代码请加群获取