#Python #字符画 #灰度图 使用Python绘制字符画及其原理
2024-09-08 19:25:50
由于最近身体状况不太好所以更新会有点慢,请大家多多包涵。同时也提醒大家注意保重身体!
前提:默认大家已经正确安装了 Python,且正确将Python配置到了系统Path 。
目录
1.字符画的概况
字符画,一种由字母、标点、汉字或其他字符组成的图画。简单的字符画是利用字符的形状代替图画的线条来构成简单的人物、事物等形象,它一般由人工制作而成;复杂的字符画通常利用占用不同数量的像素字符代替图画上不同明暗的点,它一般由程序制作而成。字符画是互联网时代的产物。
2. 实现原理
其实原理非常简单,首先,要准备一个字符集
char_set = '''$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. '''
其次,要将图片转成灰度图,所谓灰度图就是黑白照片,这个过程中还要缩小图片,每张图片缩小的比例都不尽相同,要根据图片的实际情况来决定,这样就得到了一张缩小后的黑白照片
im = Image.open('需要生成字符画图片的路径例如C:\XX\XX.png')
im = im.resize((80, 50), Image.ANTIALIAS)
im = im.convert('L') # 转为黑白图, 每个像素都一个灰度值,从0到255, 0是黑色, 255是白色
im.save('图片保存路径与想要的名称例如C:\XX\XX.jpeg') # 保存图片只是为了演示黑白照片
虽然看起来有一些丑陋,这张黑白照片一共有80*50个像素,每个像素点都可以通im.getpixel方法获得灰度值,这个值的范围是从0到255,0是黑色,255是白素,中间就是从黑到白的灰色。
接下来要做的事情就是把4000个灰度值转成字符
def get_char(gray):
if gray >= 240:
return ' '
else:
return char_set[int(gray/((256.0 + 1)/len(char_set)))]
灰度值大于240的,我都转成空字符串,这样看着舒服,其余的,按比例映射到字符集上。
强调一点,生成的txt文件不要打开查看,那样你看不到一个完整的字符画,在浏览器里打开字符画,这样才可以看到完整的,如果你把缩小的比例再放大一点,生成的字符画就会失去很多细节,一般来说,宽80就可以了,高度看情况调整。
3. 代码汇总
from PIL import Image
char_set = '''$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. '''
im = Image.open('需要生成字符画图片的路径例如C:\XX\XX.png')
im = im.resize((80, 50), Image.ANTIALIAS)
im = im.convert('L') # 转为黑白图, 每个像素都一个灰度值,从0到255, 0是黑色, 255是白色
im.save('t.jpeg')
def get_char(gray):
if gray >= 240:
return ' '
else:
return char_set[int(gray/((256.0 + 1)/len(char_set)))]
text = ''
for i in range(im.height):
for j in range(im.width):
gray = im.getpixel((j, i)) # 返回值可能是一个int, 也可能是一个三元组
if isinstance(gray, tuple):
gray = int(0.2126 * gray[0] + 0.7152 * gray[1] + 0.0722 * gray[2])
text += get_char(gray)
text += '\n'
with open('将字符画存入文本文档的路径例如C:\XX\XX.txt', 'w')as f:
f.write(text)
4.效果图
感谢您的阅读,如觉得有用请您点赞,您的鼓励是对我的最大动力!
END
2022/12/15
联系我:pengyu717@yeah.net
最新文章
- html5 canvas常用api总结(二)--绘图API
- NEFU 561 方块计算
- js windows.open()模拟POST提交
- 优秀的 HTML5 实战教程,提升你的综合开发能力
- HDU5831
- python闭包小例子
- WPF ItemsControl 控件支持鼠标滚轮滑动
- GDAL库——读取图像并提取基本信息
- 如何配置和使用Tomcat访问日志
- 积累的VC编程小技巧之树操作
- fscanf()功能具体解释
- sellenium页面元素的定位方法
- JSP 初始化参数
- 高级设置电脑系统windows7防火墙出错代码0×6D9原因与解决技巧
- React文档(九)list和key
- RabbitMQ(三): exchange 的使用
- django 把函数装饰器变为方法装饰器
- scrapy 是指user_agent
- JS几种变量交换
- PTA基础编程题目集6-5求自定类型元素的最大值 (函数题)