Python 制作枯燥的字符图

之前有讲过类似的文章[点这里],但当时是保存为TXT文档类型,这当然也很OK,但是要对字符图进一步操作就得存成图像格式了。对TXT文档截个图??

在这里插入图片描述

真是个小机灵儿鬼。

在这里插入图片描述

其实可以运用PIL,把像素映射后的字符写在自定义底色图象上,然后保存不就结了??

对于图像怎么转换(映射)到字符,还是文章开头说的那篇古董文章[点这里],,说的还算是清楚了吧

那就再啰嗦一下,顺带把事办了

在这里插入图片描述

既然是字符画,怎么能没有没有字符串!

先弄一个字符串,建议按“浓密”程度手动排序,比如:
chrs = '@&$#%QPBMFHjlcvtuoi1+=-'
allc = len(chrs)#顺便统计一下个数呗
要用的图片路径得有一个吧,输出路径得 有一个吧
img_path = r'c:\laal\beyond.jpg'
out_path = r'c:\laal\beyond_chrp.png'
要弄字符画,得把像素与字符建立起来映射(说白了就是一对一的关系),但是,要是彩色(RGB之类的都够呛)的话,那还真不像标题那么容易了,字符画,字符写出来,黑色的对吧(彩色的也有,但黑白更显表格), 那吧图片转成黑白的不就完啦???哈哈哈
img = Image.open(img_path).convert('L')
黑色的字符有了,黑白的图片有了,那然后呢????然后,然后建立对应关系呗,
  • 字符总数为 allc(之前算了
  • 然而黑白图的灰度【设为gray】(理解为颜色深浅程度就好)是0-255总共256个值
  • 那就分一下好了,每个字符负责一个灰度区间好了,区间长度如下:
per_span = 256/allc
如此,假设某一像素点灰度值为gray,那么它对应的字符在字符串中的索引位置就应该是 index = int(gray/per_span),到这里,应该就可以明白为什么当初凑字符串的时候,建议按照“稠密”来排序了【灰度0-255 有黑到白】
那么接下来的事还不是行云流水吗,
  • 第一部,纸尿裤 打开图像并转为灰度图(L模式)
from PIL import Image
img = Image.open(img.path).convert('L')
  • 第二部,没骚话了 新建一原尺寸白底新图像,再弄一个Draw对象用来在新图上写入字符
from PIL import ImageDraw
new_img = Image.new('RGB', img.size, (255,255,255))
draw = ImageDraw.Draw(new_img)
  • 第三部,删除线根据设定好的字符大小,跳跃遍历原图像,并获取相应点的灰度值,从而通过映射选取合适的字符写入新图对应坐标
    for y in range(0, img.size[1], font_size):
        for x in range(0, img.size[0], font_size):
            gray = img.getpixel((x, y))
            char = chrs[int(gray//per_span)]
            draw.text((x, y), char, font=font, fill=chr_color, direction=None)

在这里插入图片描述

到此已经基本实现,只需要将new_img 进行保存就克


  • 完整代码

'''
img         待转换图(Image对象
font_size   字符大小(默认15
up_size     源图片放大倍数(默认1.1
bg          背景颜色(默认白
chr_color   字符颜色(默认黑
'''
def chr_im(img, font_size=15, up_size=1.1, bg=(255,255,255), chr_color='black'):
    chrs = '@&$#%QPBMFHjlcvtuoi1+=-'  # 字符集
    allc = len(chrs)
    per_span = 256 / allc

    font = ImageFont.truetype(r'c:\windows\fonts\simsun.ttc', font_size)
    img = img.resize((int(img.size[0]*up_size), int(img.size[1]*up_size)))
    img = img.convert('L')
    new_img = Image.new('RGB', (img.size), bg)
    draw = ImageDraw.Draw(new_img)
    for y in range(0, img.size[1], font_size):
        for x in range(0, img.size[0], font_size):
            gray = img.getpixel((x, y))
            char = chrs[int(gray//per_span)]
            draw.text((x, y), char, font=font, fill=chr_color, direction=None)
    return new_img

在这里插入图片描述

效果可以自己调节参数,颜色分辨率什么的

在这里插入图片描述

做成了图自然有很多玩法, 表白制作表情包什么的,或者进一步制作字符动画那也是很妙的
《鲁迅 说》

在这里插入图片描述

PIL Image.paste() 透明像素问题

图片变字符画,其实很简单

干货!Windows频幕二维码识别小工具

python 图片拼接、图片转pdf

今日头条美图爬取,有你想要的

python 精美壁纸、简单爬虫,告别壁纸荒

Python 图片拼心,表白利器

Python 以字成图,花式表白,脱单趁早

奇妙的“字符26进制”

从视频中提取图像

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔的壳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值