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进制”

从视频中提取图像

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

薛定谔的壳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值