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)   

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

学习资源推荐

除了上述分享,如果你也喜欢编程,想通过学习Python获取更高薪资,这里给大家分享一份Python学习资料。

这里给大家展示一下我进的兼职群和最近接单的截图

兼职群

私单

😝朋友们如果有需要的话,可以 V扫描下方二维码联系领取,也可以内推兼职群哦~

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

#### **一、Python学习路线**

image-20230619144606466

python学习路线图1

二、Python基础学习
1. 开发工具

2. 学习笔记

在这里插入图片描述

3. 学习视频

在这里插入图片描述

三、Python小白必备手册

图片

四、数据分析全套资源

在这里插入图片描述

五、Python面试集锦
1. 面试资料

在这里插入图片描述

在这里插入图片描述

2. 简历模板

在这里插入图片描述

因篇幅有限,仅展示部分资料,添加上方即可获取👆

------ 🙇‍♂️ 本文转自网络,如有侵权,请联系删除 🙇‍♂️ ------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值