Python 生成字符画

跑在 python3 下,可以通过输入图片来生成字符画。大致原理在注释中有提到。具体的像素和符号转化关系,我没有去深入了解。

#! /Users/michael/anaconda3/bin/python3

from PIL import Image
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('file') # input file
parser.add_argument('-o', '--output') # output file (optional)
parser.add_argument('--width', type=int, default=80) # 字符画宽度
parser.add_argument('--height', type=int, default=80) # 字符画高度

args = parser.parse_args() # 获取参数
image = args.file
output = args.output
width = args.width
height = args.height

chs = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. "
ascii_char = list(chs)

# 根据图片的每个像素来转成对应的字符。
# 可以看出,越往后字符的笔画越稀疏,也就是颜色越浅。
def get_char(r, g, b, alpha=256): 
    if alpha == 0:
        return ' '
    length = len(ascii_char)
    grey = int(0.2126*r + 0.7152*g + 0.0722*b)
    unit = (257)/length
    return ascii_char[int(grey/unit)]


im = Image.open(image)
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)

with open('fun.txt', 'w', encoding='utf-8') as f:
    f.write(txt)
复制代码

运行命令:

python3 draw.py --width 60 --height 30 test.png
复制代码

这是原图:

以下是效果图:

                     ,:                               
                       )$$$$$$$                             
                      n$$$$$$$$$             $$$$$$         
                       $$$$$$$$$            $$$$$$$$$       
              $         $$$$$              .$$$$$$$$$       
           h%        $$$                      .$$$$$        
          $        $$$8                         $<          
        J$        $$$$                                      
       -$+       $$$$                                       
       $$       @$$$$       $$$$                            
      ]$$       $$$$$     $$$$$$$       $$$$$               
      $$$       $$$$$     $$$$$$       $$$$$$$      $       
      $$$&      $$$$$$    $$$$$         $$$$$$     $$       
      B$$$      $$$$$$$                  $$$$`    1$$       
       $$$$.    $$$$$$$$$                        $$$$       
       $$$$$$  }$$$$$$$$$$$$$  .$$$$$$         $$$$$$       
       $$$$$$$$ $$$$$$$$$$$$$$    m    ^$$$$$$$$$$$$$       
       $$$$$$$$$$$$$$$$$$$$$$$$$!$$$$$$$$$$$$$$$$$$$$       
       W$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$        
        $$$$$$$$$$$$$$$$$$$$$$$$$$$o  t$$$$$$$$$$$$@        
        +$$$$$$$$$$W$$$$$$$$$$$$$$$    $$$$$$$$$$$$         
         ;$$$$$$$$$ -$$$$$$$$$$$$$$    $$$$$$$$$$$          
           $$$$$$$$#  $$$$$$$$$$$$$    $$$$$$$$$$c          
              p$$$W    $$$$$$$$$$$$   C$$$$$$$$$%           
                        $$$$$$$$$$$$  %$$$$$$$$             
                          $$$$$$$$$$W  t$$p                 
                             $$$$$$$                        
                                                    
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值