Python 50行代码实现图片转字符画

2018-09-22  本文已影响0人  DonLex

前几天在网上看到Python图片转字符画的教程,现在我也来分享一下,毕竟好玩的要一起玩才有意思嘛

一、工具库

二、实验原理

字符画是一系列字符的组合,我们可以把字符看作是比较大块的像素,一个字符能表现一种颜色(暂且这么理解吧),字符的种类越多,可以表现的颜色也越多,图片也会更有层次感。

问题来了,我们是要转换一张彩色的图片,这么这么多的颜色,要怎么对应到单色的字符画上去?这里就要介绍灰度值的概念了。

灰度值:指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像

我们可以使用灰度值公式将像素的 RGB 值映射到灰度值:

gray = 0.2126 * r + 0.7152 * g + 0.0722 * b

这样就好办了,我们可以创建一个不重复的字符列表,灰度值小(暗)的用列表开头的符号,灰度值大(亮)的用列表末尾的符号。

三、实验步骤

  1. 安装pillow

    pip install pillow

  2. 准备一张图片

  3. 代码

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

上一篇 下一篇

猜你喜欢

热点阅读