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










评论