前几天在网上看到Python图片转字符画的教程,现在我也来分享一下,毕竟好玩的要一起玩才有意思嘛
一、工具库
- pillow 库
二、实验原理
字符画是一系列字符的组合,我们可以把字符看作是比较大块的像素,一个字符能表现一种颜色(暂且这么理解吧),字符的种类越多,可以表现的颜色也越多,图片也会更有层次感。
问题来了,我们是要转换一张彩色的图片,这么这么多的颜色,要怎么对应到单色的字符画上去?这里就要介绍灰度值的概念了。
灰度值:指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像
我们可以使用灰度值公式将像素的 RGB 值映射到灰度值:
gray = 0.2126 * r + 0.7152 * g + 0.0722 * b
这样就好办了,我们可以创建一个不重复的字符列表,灰度值小(暗)的用列表开头的符号,灰度值大(亮)的用列表末尾的符号。
三、实验步骤
-
安装pillow
pip install pillow
-
准备一张图片
-
代码
from PIL import Image
codeLib = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`'. ''' # 生成字符画所需的字符集
count = len(codeLib)
def transform1(image_file):
image_file = image_file.convert("L") # 转换为黑白图片,参数"L"表示黑白模式
codePic = ''
for h in range(0, image_file.size[1]): # size属性表示图片的分率,'0'为横向大小,'1'为纵向
for w in range(0, image_file.size[0]):
gray = image_file.getpixel((w, h)) # 返回指定位置的像素,如果所打开的图像是多层次的图片,那这个方法就返回一个元组
codePic = codePic + codeLib[int(((count - 1) * gray) / 256)] # 建立灰度与字符集的映射
codePic = codePic + '\r\n'
return codePic
fp = open(u'blue_cat.jpg', 'rb')
image_file = Image.open(fp)
image_file = image_file.resize((int(image_file.size[0] * 0.75), int(image_file.size[1] * 0.5))) # 调整图片大小
print(u'Info:', image_file.size[0], ' ', image_file.size[1], ' ', count)
tmp = open('pa.txt', 'w')
tmp.write(transform1(image_file))
tmp.close()
原图:

转换为字符画(注:在记事本打开时记得取消自动换行,下图字体:宋体 字号:小六)
最后
欢迎关注公众号“Python绿洲“
个人博客站点: https://www.donlex.cn
网友评论