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模块:

    1. parser = argparse.ArgumentParser():创建ArgumentParser对象parser,ArgumentParser对象保存了所有必要的信息,用以将命令行参数解析为相应的python数据类型。
    2. parser.add_argument():向ArgumentParser对象添加命令行参数信息,这些信息告诉ArgumentParser对象如何处理命令行参数。

      ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

    3. 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

results matching ""

    No results matching ""