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 pip
pip 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
版权声明: 本文为 InfoQ 作者【okokabcd】的原创文章。
原文链接:【http://xie.infoq.cn/article/878c99886087794c5b282a260】。文章转载请联系作者。
okokabcd
关注
还未添加个人签名 2019.11.15 加入
还未添加个人简介
评论