Python 图片转字符画
Posted Crown-V
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 图片转字符画相关的知识,希望对你有一定的参考价值。
一.安装的第三方模块
$ sudo pip3 install --upgrade pip $ sudo pip3 install pillow //window pip3 install pillow
二.RGB转换为黑白度的简单公式
gray = 0.2126 * r + 0.7152 * g + 0.0722 * b
三.新建py文件
1.首先导入第三方模块
from PIL import Image import argparse
2.获取图片信息
使用 argparse 处理命令行参数,目标是获取输入的图片路径、输出字符画的宽和高以及输出文件的路径
# 首先,构建命令行输入参数处理 ArgumentParser 实例 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
3.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)]
4.图片处理
步骤: 1.首先使用 PIL 的 Image.open 打开图片文件,获得对象 im 2.使用 PIL 库的 im.resize() 调整图片大小对应到输出的字符画的宽度和高度,注意这3.个函数第二个参数使用 Image.NEAREST,表示输出低质量的图片。 4.遍历提取图片中每行的像素的 RGB 值,调用 getchar 转成对应的字符 5.将所有的像素对应的字符拼接在一起成为一个字符串 txt 6.打印输出字符串 txt 7.如果执行时配置了输出文件,将打开文件将 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): # 将 (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)
5.整体代码
# -*- coding=utf-8 -*- 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__\': 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)
以上是关于Python 图片转字符画的主要内容,如果未能解决你的问题,请参考以下文章