写点什么

Python 写实用小工具 - 实现图片转字符画

作者:okokabcd
  • 2022 年 5 月 24 日
  • 本文字数:1915 字

    阅读完需:约 6 分钟

一、介绍

字符画,是一系列字符的组合,我们可以把每个字符看成是一个大的像素,一个字符可以代表一种颜色,字符各类越多,可体现的颜色越多,字符画就更有层次感。


灰度值,指黑白图像中点的颜色的深度,范围是 0-255,白色为 255,黑色为 0。


RGB,是红绿蓝三颜色,通过不同的叠加可得到其他颜色。


图片转字符画原理,先定义一个字符集用来和灰度值做映射,将图片每个像素的 RGB 值转换为一个灰度值,将其对应的字符输出就得到字符画。


RGB 转灰度值,有个心理学公式,在网上搜一下我们使用下面这个公式


gray = (2126 * r + 7152 * g + 722 * b) / 10000
复制代码

二、实现

2.1 准备

# 1. 我们用到的是Python3,确保有Python3的环境python3 -V
# 2. 安装Python图象处理库pillow(PIL)pip install --upgrade pippip install pillow
复制代码

2.2 代码

ascii.py


#!/usr/bin/python3#coding: utf-8
from PIL import Image
# ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")ascii_char = list('MNHQ$OC?7>!:–;. ')
def get_char(r, g, b, alpha=256): if alpha == 0: return ' ' # 这是一个优化,将浮点运算转成整型运算 gray = (2126 * r + 7152 * g + 722 * b) / 10000 # 为什么是1.0 因为alpha、gray是整型运算的时候按整型算如果小于1的话按0算 char_idx = int((gray / (alpha + 1.0)) * len(ascii_char)) return ascii_char[char_idx]
def write_file(out_file_name, content): with open(out_file_name, 'w') as f: f.write(content)
def main(file_name="test.jpg", width=100, height=80, out_file_name='output.txt'): text = '' im = Image.open(file_name) im = im.resize((width, height), Image.NEAREST) for i in range(height): for j in range(width): text += get_char(*im.getpixel((j, i))) text += '\n' print(text) write_file(out_file_name, text)
if __name__ == '__main__': main('dora.png')
复制代码

2.3 测试

# 1. 准备图片dora.png# 2. 执行命令python3 ascii.py
复制代码



                                                                 MMH$$$NM                                     MQ7777>   $N   OM                               O7777777     C    77OM                          C77777777   >  Q:   $777M                        77777777$>Q     7O$O     Q$                     M?777777N    N   O H .N    >N?>                   777777N   :N:     >QQQQ H                        N77777               MN   .:????                 M77777?  ;:???QQQQ!    H                          H7777H                 !    !HO;                  C7777    QQQQQHNNHNM$> :       O                  C7777    QQQQQQQQQQQQQQQQQQQQQO ?                 $7777    QQQQQQQQQQQQQQQQQQQQ$  M                 M7777    CQHNC?$MHQQQQQQQQQQM  –                   ?777     ?77777777?QQQQQQQ?   M                   M777N     $777777777MQQQH–   ?                     ?777!     .777777777QQH    !                       C777       ?O777777N!    :                         ?77?–       .!QQMMMMMH$M                           O777NNQQQQQ      Q–QCMNM                           NQQNQ7777H      Q;;;; M                            77777777C      O;;;C ?                            777777777O    > H??                               ?777777Q! ;HO:      ;H  MC:N                      H7O$777$ :           ?M      M                    M777777H  ?          N       Q                     ?77777?   :        ;        Q                 QQQMH777777C    .?Q?:  H        M                 QQQM$7777777Q        Q7?                             M77777777777QQ?NO777H       M                     M7777777777777777$MM N    ;                     M N77777777777OM                                     C7777777HM                                         77777QM                                             7QM                                         ;                                                  O                                                   M$?OM                                    
复制代码

三、总结

  • 2202/5/24 学习 python 的基础应用及 pillow 库的使用

发布于: 刚刚阅读数: 4
用户头像

okokabcd

关注

还未添加个人签名 2019.11.15 加入

还未添加个人简介

评论

发布
暂无评论
Python写实用小工具-实现图片转字符画_Python_okokabcd_InfoQ写作社区