啥是佩奇?

2019年1月17日,一则贺岁短片《啥是佩奇》,刷爆朋友圈。

这是一只程序猿突然想到的知识点...

你认识这样的佩奇吗?_IT


你认识这样的佩奇吗?_IT_02


代码(ascii.py)

#!/usr/bin/env python3	
# -*- 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	
# 示例:$ python ascii.py p.png -o out.txt --width 90 --height 45	
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)

运行

//请先安装 python3 、pip	
//install	
pip install argparse	
pip install pillow	
//命令	
python3 ascii.py peppapig.png -o peppapig.txt 

你认识这样的佩奇吗?