Python实现将图片转换为ASCII字符画

 更新时间:2022年08月15日 16:48:07   作者:小小明-代码实体  
这篇文章主要介绍了Python实现将图片转换为ASCII字符画,要将图片转换为字符图其实很简单,我们首先将图片转换为灰度图像,这样图片的每个像素点的颜色值都是0到255,然后我们选用一些在文字矩形框内占用面积从大到小的ASCII码字符

前言

要将图片转换为字符图其实很简单,我们首先将图片转换为灰度图像,这样图片的每个像素点的颜色值都是0到255,然后我们选用一些在文字矩形框内占用面积从大到小的ASCII码字符,我经过一番观察选择了如下字符:

ascii_chars = "MNHQ$OC67+>!:-. "

很明显M的笔画比N多,缩小到足够小之后就会体现出M的颜色比N更深,大家若能够找到更能够体现这种特征的字符,也可以替换。

然后我们只需要将图片的目标像素点映射到这批字符上,代码大概就是:

ascii_chars[color*(len(ascii_chars)-1)//255]

字符画图片生成

先准备好测试图片:

from PIL import Image
img = Image.open('test.jpg')
img

然后我们将图片转换为灰度图片并缩放到指定大小:

new_w = 100
w, h = img.size
img = img.convert("L").resize((new_w, int(new_w*h//w)))
w, h = img.size
data = img.load()
img

然后开始绘制字符图片:

from PIL import ImageFont, ImageDraw

f_size = 3
img_new = Image.new('L', (w * f_size, h * f_size), 255)
f = ImageFont.truetype('arial.ttf', f_size)
d = ImageDraw.Draw(img_new)
n = len(ascii_chars)-1
for y in range(h):
    for x in range(w):
        char = ascii_chars[data[x, y]*n//255]
        d.text((x * f_size, y * f_size), char, fill=0, font=f)
img_new

个人感觉效果还是不错的,我们可以把上述逻辑封装成一个方法:

from PIL import Image, ImageFont, ImageDraw
def img2charImg(filename, new_wight, font_size):
    "小小明:https://blog.csdn.net/as604049322"
    ascii_chars = "MNHQ$OC67+>!:-. "
    img = Image.open(filename)
    w, h = img.size
    img = img.convert("L").resize((new_wight, int(new_wight*h//w)))
    w, h = img.size
    data = img.load()
    img_new = Image.new('L', (w * font_size, h * font_size), 255)
    f = ImageFont.truetype('arial.ttf', font_size)
    d = ImageDraw.Draw(img_new)
    n = len(ascii_chars)-1
    for y in range(h):
        for x in range(w):
            char = ascii_chars[data[x, y]*n//255]
            d.text((x * font_size, y * font_size), char, fill=0, font=f)
    return img_new

测试一下:

img2charImg("love.jpg", 200, 2)

效果:

分别是原图和执行结果:

我们可以通过第二个参数调大字符程度,最终图片的宽度是两个参数相乘。

字符画文字的生成

搞定了字符图片的生成之后,我们考虑直接生成字符文字,但是ASCII码字符在显示时,往往宽度是高度的一半,所以我们在生成字符画文字时需要事先将图片高度压扁一半。

完整代码如下:

from PIL import Image

def img2charTxt(filename, new_wight, txtname):
    "小小明:https://blog.csdn.net/as604049322"
    ascii_chars = "MNHQ$OC67+>!:-. "
    img = Image.open(filename)
    img = img.convert("L")
    w, h = img.size
    img = img.resize((new_wight*2, int(new_wight*h//w)))
    w, h = img.size
    data = img.load()
    result = []
    n = len(ascii_chars)-1
    for y in range(h):
        line = "".join(ascii_chars[data[x, y]*n//255] for x in range(w))
        line += "\n"
        result.append(line)
    with open(txtname, "w") as f:
        f.writelines(result)

测试一下:

img2charTxt("test.jpg", 100, "image.txt")

可以看到在文本编辑器中的显示效果是相当不错的。

到此这篇关于Python实现将图片转换为ASCII字符画的文章就介绍到这了,更多相关Python图片转换ASCII字符画内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Python实现字典合并的四种方法

    详解Python实现字典合并的四种方法

    这篇文章主要为大家详细介绍了Python的合并字典的四种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 浅谈python的上下文管理器with的用法

    浅谈python的上下文管理器with的用法

    这篇文章主要介绍了浅谈python的上下文管理器with的用法,在一段代码执行前, 先执行__enter__中的代码用于预处理,然后执行 with 中间的代码,最后执行完这段代码之后再执行 exit 中的代码进行清理工作,需要的朋友可以参考下
    2023-07-07
  • python基于paramiko库远程执行 SSH 命令,实现 sftp 下载文件

    python基于paramiko库远程执行 SSH 命令,实现 sftp 下载文件

    这篇文章主要介绍了python基于paramiko库远程执行 SSH 命令,实现 sftp 下载文件的方法,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-03-03
  • Python 使用office365邮箱的示例

    Python 使用office365邮箱的示例

    这篇文章主要介绍了Python 使用office365邮箱的示例,帮助大家利用python进行高效办公,感兴趣的朋友可以了解下
    2020-10-10
  • 浅谈Python的list中的选取范围

    浅谈Python的list中的选取范围

    今天小编就为大家分享一篇浅谈Python的list中的选取范围,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • Python3.5集合及其常见运算实例详解

    Python3.5集合及其常见运算实例详解

    这篇文章主要介绍了Python3.5集合及其常见运算,结合实例形式分析了Python3.5集合的定义、功能、交集、并集、差集等常见操作技巧与相关注意事项,需要的朋友可以参考下
    2019-05-05
  • Python采集热搜数据实现详解

    Python采集热搜数据实现详解

    这篇文章主要为大家介绍了Python采集热搜数据实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • PyQt4 treewidget 选择改变颜色,并设置可编辑的方法

    PyQt4 treewidget 选择改变颜色,并设置可编辑的方法

    今天小编就为大家分享一篇PyQt4 treewidget 选择改变颜色,并设置可编辑的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • python实现nao机器人身体躯干和腿部动作操作

    python实现nao机器人身体躯干和腿部动作操作

    这篇文章主要为大家详细介绍了python实现nao机器人身体躯干和腿部动作操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • Django后台获取前端post上传的文件方法

    Django后台获取前端post上传的文件方法

    今天小编就为大家分享一篇Django后台获取前端post上传的文件方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05

最新评论