Python实现将图片转换为ASCII字符画
作者:小小明-代码实体 发布时间:2023-08-12 08:42:42
标签:Python,图片,转换,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")
可以看到在文本编辑器中的显示效果是相当不错的。
来源:https://blog.csdn.net/as604049322/article/details/126336169


猜你喜欢
- docker安装mysql版本8.0.20,供大家参考,具体内容如下第一步 下拉镜像docker pull mysql:8.0.20第二步
- 如果这个问题不解决,那么MySQL将无法实际处理中文。 出现这个问题的原因是因为MySQL在查询字符串时是大小写不敏感的,在编绎MySQL时
- 我就废话不多说了,直接上代码吧!#!/usr/bin/env python# coding:UTF-8"""@
- 一、标识符何为标识符?标识符是用来标识某个实体的一个符号。在编程语言中,标识符是计算机语言中作为名字的有效字符串集合。标识符是用户编程时使用
- 前言装饰器(decorator)在Python框架中扮演着重要角色,是Python中实现切面编程(AOP)的重要手段。aspect-orie
- 上一篇我们写了Django基于类如何增删改数据的方法,方法虽然简单,但新手可能对其原理不是很清楚,那么我们这次就用Django提供的Mode
- 到底什么是Python?•Python是一种解释性语言。Python代码在运行之前不需要编译。其它解释性语言还包括PHP和Ruby。•Pyt
- 窗口函数形如:表达式 OVER (PARTITION BY 分组字段 ORDER BY 排序字段)有两个能力:当表达式为 rank() de
- 初识word文档-节-的概念编辑一篇word文档,往往首先从页面设置开始,从下图可以看出,页面设置常操作的有页边距、纸张方向、纸张大小4个,
- 从小的方面讲,帮助一般是指:手册、说明书、文档、FAQ 等等。从大的方面讲,可以是交互过程中的提示、指引、演示等信息,帮助无处不在!这一切,
- 本文为大家分享了Java基于MySQL实现学生管理系统,供大家参考,具体内容如下因为实验室要交作业然后就做了一个学生管理系统,贴个代码纪念一
- 一、 安装tensorboard直接pip即可:pip install tensorboard这里注意,使用pytorch,并不需要额外安装
- 知识点:字符串在编程里,用的最多的就是字符串,字符串同时也是各类数据的中转站字符串运算符:编号运算符类型说明1+字符串拼接2*同一字符串多次
- 1.列表推导式书写形式:[表达式 for 变量 in 列表] 或者 [表达式 for 变量
- 此代码适合你做网站用,普通朋友可以不用理这个东西!ASP:<%dim objXMLHTTP, qq, pwd qq = &
- 在讲CSS优先级之前,我们得要了解什么是CSS,CSS是用来做什么的。首先,我们对CSS作一个简单的说明:CSS是层叠样式表(Cascadi
- 纪念我的第一个爬虫程序,一共写了三个白天,其中有两个上午没有看,中途遇到了各种奇怪的问题,伴随着他们的解决,对于一些基本的操作也弄清楚了。果
- 说明1.windows上安装安卓模拟器,安卓版本5.1以上2.模拟器里下载安装最新的微信6.6.13.最好使用python2.7,pytho
- question: Django中对数据库的调用非常的隐蔽,在各种复杂的模块互相拼接继承中很难发现获取数据库内容的部分来,开始试图理解一下下
- 在python中,用pandas处理数据非常方便。但是有时候从其他地方读取数据时,会有异常值需要处理。比如,我们要从excel读取数据然后调