一、前言
昨夜刷b站的时候,看到了一条评论,形式如下图,于是心血来潮写了个python脚本,可以根据文字来生成这种由emoji拼接成的“文字”。
二、思路
代码的思路极其简单,这种形式的“文字”可以理解为一张黑白图片,图中的白色使用一种emoji表情代替,黑色使用另一种emoji代替。那么想要生成这种“文字”,则我们只需要两步即可,第一步是根据输入文字得到一张图,第二步则是遍历这张图片,当前像素的颜色为黑色时我们输出CN表情,为白色时输出*表情。在网上简单搜索了一下,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('CN', end = '') #传入end参数,用于指定不换行 else: print('*', end = '') print('') getEmojiTextFromPureText('全世界无产者联合起来')
四、遗留问题
该脚本中有几个遗留的小问题:
1.因为在手机微信中发送消息时会将过长的消息自动换行,所以脚本中将fontSize指定为11,但是这样生成出来的文字分辨率很低,面对一些复杂的问题时,最终得到的结果会难以辨识。
2.因为将长度扩展了1.2倍,所以生成出来的结果中在上下两侧会冗余一些无用的emoji表情。
3.本脚本并未将结果输出至文本中,仅在控制台打印 使用或有不便。
到此这篇关于python实战之用emoji表情生成文字的文章就介绍到这了,更多相关python用emoji表情生成文字内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/x670127565/article/details/116423452