实验楼之"Python图片转字符画"

  • Python 图片转字符画
  • 实验环境
  • 安装 pillow 库
    $ sudo pip3 install --upgrade pip
    $ sudo pip3 install pillow

     

  • 参考代码
    # -*- coding=utf-8 -*-
    
    # argparse 库是用来管理命令行参数的
    from PIL import Image
    import argparse
    
    # 构建命令行输入参数处理 ArgumentParser 实例
    parser = argparse.ArgumentParser()
    
    # 定义输入文件、输出文件、输出字符画的宽和高
    parser.add_argument('file')
    parser.add_argument('-o','--output')
    
    parser.add_argument('--width', type = int, default = 120)
    parser.add_argument('--height', type = int, default = 70)
    
    # 解析并获取参数
    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;:,\"^`'. ")
    
    # RGB值转字符的函数,alpha值为0时表示图片中该位置为空白
    def get_char(r,g,b,alpha = 256):
    
        # 判断 alpha 值
        if alpha == 0:
            return ' '
        
        # 获取字符集的长度
        length = len(ascii_char)
    
        # 将 RGB 值转换为灰度值 grey, 灰度值范围为 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)]
    
    # 若 ascii.py 被当作python模块import时,这部分代码不会被执行
    if __name__ == '__main__':
    
        # 获取对象im, 使用PIL库中的resize()调整图片大小对应到输出字符画的宽度和高度
        # Image.NEAREST表示输出低质量的图片 
        im = Image.open(IMG)
        im = im.resize((WIDTH,HEIGHT), Image.NEAREST)
    
        txt = ""
    
        for i in range(HEIGHT):
    
            for j in range(WIDTH):
    
                # 调用PIL库中的getpixel获取坐标位置的RGB像素值
                # * 可以将元组作为参数传递给get_char函数中对应的每个参数
                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)
    
  • 成果示意图:

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值