如何用Python实现表情包生成文字,思路及代码是什么
Admin 2022-07-08 群英技术资讯 948 次浏览
这篇文章给大家分享的是“如何用Python实现表情包生成文字,思路及代码是什么”,对大家学习和理解有一定的参考价值和帮助,有这方面学习需要的朋友,接下来就跟随小编一起学习一下吧。昨夜刷b站的时候,看到了一条评论,形式如下图,于是心血来潮写了个python脚本,可以根据文字来生成这种由emoji拼接成的“文字”。

代码的思路极其简单,这种形式的“文字”可以理解为一张黑白图片,图中的白色使用一种emoji表情代替,黑色使用另一种emoji代替。那么想要生成这种“文字”,则我们只需要两步即可,第一步是根据输入文字得到一张图,第二步则是遍历这张图片,当前像素的颜色为黑色时我们输出表情,为白色时输出b表情。在网上简单搜索了一下,PIL中的ImageDraw类型含有text方法用于生产文字图片,本脚本即采用该方法实现。
脚本代码如下,各种注意事项均已在代码注释中写明。
# coding=utf-8
from PIL import Image, ImageFont, ImageDraw
import numpy as np
def getTextImage(text, fontFilePath = None, fontSzie = 10):
#此处踩坑,truetype方法必须传入字体文件路径,传入None会报错
font = ImageFont.truetype(fontFilePath, fontSzie, encoding='unic')
#此处踩坑,在生成图片的文字为多行文字时,getsize方法返回的宽高会交换,具体什么原因未知,但是这么写就是对的
height,width = font.getsize(text)
#此处踩坑,getsize方法返回的高度在有些情况下可能不够长 因此将高度拓展为原来的1.2倍
height = int(height * 1.2)
#生成一张黑白纹理
img = Image.new("1", (width, height))
draw = ImageDraw.Draw(img)
#textsize方法同样可以得到要生成的文字的大小 该大小更为准确 那么为啥不用这个大小直接生成图片呢 存疑
w,h = draw.textsize(text, font)
#渲染文字, 第一个参数是offset,此处传入的值是为了让渲染的文字居于图片的中心
draw.text(((width - w) / 2 ,(height - h) /2 ), text, font = font, fill='red', align='center')
# img.show()
return img
def getEmojiTextFromPureText(text):
#在输入的文字中插入换行符,以得到竖排文字
mutilLineText = ''
lens = len(text)
for i in range(lens):
mutilLineText += text[i]
if i != lens - 1:
mutilLineText += '\n'
#此处踩坑 在mac上有些字体生成汉字是会乱码,经本人尝试,simsun.ttc字体和Hiragino Sans GB.ttc字体均可生成中文图片,其余的不知道哪种字体可行
img = getTextImage(mutilLineText, '/Users/xiaoyi/Downloads/simsun.ttc', fontSzie= 11)
#将PIL的Image转为np的array 遍历图片输出即可
array = np.array(img)
height,width = array.shape
for j in range(height):
for i in range(width):
if array[j][i] :
print('', end = '') #传入end参数,用于指定不换行
else:
print('', end = '')
print('')
getEmojiTextFromPureText('全世界无产者联合起来')
使用该脚本生成“文字”效果如下:
该脚本中有几个遗留的小问题:
1.因为在手机微信中发送消息时会将过长的消息自动换行,所以脚本中将fontSize指定为11,但是这样生成出来的文字分辨率很低,面对一些复杂的问题时,最终得到的结果会难以辨识。
2.因为将长度扩展了1.2倍,所以生成出来的结果中在上下两侧会冗余一些无用的emoji表情。
3.本脚本并未将结果输出至文本中,仅在控制台打印 使用或有不便。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
在Scala中,集合有三大类:List、Set以及Map,所有的集合都扩展自Iterable特质。Scala集合分为可变的(mutable)和不可变(immutable)的集合。其中,可变集合可以在适当的地方被更新或扩展,意味着可以对集合进行修改、添加、移除元素;不可变集合类,相比之下,初始化后就永远不会改变。
这篇文章主要介绍了Python Python 如何将字符串每两个用空格隔开的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
信号的概念信号(signal)--进程之间通讯的方式,是一种软件中断。一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号。几个常用
本篇文章给大家带来了关于Python的相关知识,主要为大家详细介绍了Python NumPy中数组的创建方式,文中的示例代码讲解详细,对我们学习Python有一定帮助,需要的可以参考一下。
这篇文章给大家分享的是有关Pytorch中gather的用法的内容,很多新手对于gather的用法不是很了解,因此分享一些给大家做个参考,希望大家阅读完这篇能有收获,接下来一起跟随小编看看吧。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008