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
0
投稿
猜你喜欢
- turtle的文档:https://docs.python.org/3/library/turtle.html用Python的turtle库
- python中的paramiko模块是用来实现ssh连接到远程服务器上的库,在进行连接的时候,可以用来执行命令,也可以用来上传文件。1、得到
- 用python写了一个简单版本的textrank,实现提取关键词的功能。import numpy as np import jieba im
- 绘制动图FuncAnimation,它的使用要求简洁且定制化程度较高。如果想将很多图片合并为一个动图,那么ArtistAnimation是最
- Python int() 函数描述int() 函数用于将一个字符串或数字转换为整型。语法以下是 int() 方法的语法:class int(
- 数据库:30万条,有ID列但无主键,在要搜索的“分类”字段上建有非聚集索引过程T-SQL: /* 用户自定义函数:执行时间在115
- 一、两种模式pytorch可以给我们提供两种方式来切换训练和评估(推断)的模式,分别是:model.train() 和 model.eval
- 数据概况Fashion-mnist经典的MNIST数据集包含了大量的手写数字。十几年来,来自机器学习、机器视觉、人工智能、深度学习领域的研究
- 我们在使用Django的models查询数据库时,可以看到有这种写法:form app.models import&nb
- 曾经有许多创造性的logo设计案例,logo设计资源和logo设计指导张贴在互联网的各个角落。这些帮助会为你的logo设计创造一个功能强大的
- 问题描述当前使用的PyCharm社区版版本号2022.1.2,配置镜像源时,没有manage repositories解决方案:镜像源:清华
- 平时每逢alexa排名更新时,我都需要将所有相关的同类网站的排名整理一下,看一下这些对手网站的排名更新情况。做的多了,也就烦了,虽然也才30
- 很早很早的时候,computer这个东西习惯于被称之为计算机,因为它的主要功能是完成一些科学计算的东西,我记得自己鼓捣它的时候,就是计算,根
- python封装利用begin end执行多条sql因为业务需求,优化模型运行时间。考虑到sql语句每一次执行都要建立连接,查询,获取数据耗
- 上一篇文章中,我们介绍了python实现图片处理和特征提取详解,这里我们再来看看Python通过OpenCV实现批量剪切图片,具体如下。做图
- 本文实例总结了Python列表list常用内建函数。分享给大家供大家参考,具体如下:>>> x = list(range(
- 当数据库服务器建立好以后,我们首先要做的不是考虑要在这个支持数据库的服务器运行哪些受MySQL提携的程序,而是当数据库遭到破坏后,怎样安然恢
- 本文是基于opencv将视频和动态图gif保存为图像帧。可以根据输入视频格式的不同,修改第21行。 &nb
- 本文实例为大家分享了python pygame模块编写飞机大战的具体代码,供大家参考,具体内容如下该程序没有使用精灵组,而是用列表存储对象来
- a. 如果欲使用gb2312编码,那么php要输出头:header(“Content-Type: text/html; charset=gb