Python 实例学习1 字符画

参考实验楼的实验,将一幅画转换成字符画。实验楼的链接:https://www.shiyanlou.com/courses/370。

基本思路:图片中的每个像素点,都有RGB值,根据RGB值,推算出灰度值。根据自定义的ascii_char这个序列,将像素点转换成字符,这样就能画出字符画了。

完整的代码如下:

# 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=153) # 输出字符画宽
parser.add_argument('--height', type=int, default=153) # 输出字符画高

# 获取参数
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, b, g, 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__':

    rim = Image.open(IMG)
    im = rim.convert('RGB')  
    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))) #把图片中坐标为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)

 

需要学习的几个点:

1、argparse模块,用来接受参数的输入,测试代码如下:

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('--width', type=int, default=80)
parser.add_argument('--height', type=int, default=80)

args = parser.parse_args()

W=args.width
H=args.height

print W*H

运行结果:

 

2.图片处理的模块,可以模仿

 

posted on 2017-02-27 15:11  nasduc  阅读(556)  评论(0编辑  收藏  举报

导航