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

Ryan
Ryan
发布时间:2026-10-15 | 6人浏览过
原创

本文介绍如何使用Python将图片转换为ASCII字符画。核心步骤包括将图片转为灰度图,根据像素亮度映射到预设的ASCII字符集,并通过PIL库绘制或生成文本文件。文章提供了生成图像和纯文本两种方式的完整代码示例及参数调整方法。

前言

实现图片到字符图的转换并不复杂。首先需将原图转换为灰度图像,使每个像素点的颜色值落在0至255的范围内。随后,选取一组在矩形框内占用面积由大到小排列的ASCII字符。经过观察,本文选定以下字符序列:

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

从视觉特征来看,字符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 相关产品和应用

全部下载

专题列表