【python】用emoji表情生成文字

背景:

    昨夜刷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('全世界无产者联合起来')


效果:

使用该脚本生成“文字”效果如下:

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✨✨✨✨✨✨✨✨✨🇨🇳🇨🇳✨✨✨✨✨✨✨✨✨
✨✨✨✨✨✨✨✨🇨🇳🇨🇳✨✨✨✨✨✨✨✨✨✨
✨✨✨✨✨✨✨✨🇨🇳✨🇨🇳✨✨✨✨✨✨✨✨✨
✨✨✨✨✨✨✨🇨🇳✨✨✨🇨🇳✨✨✨✨✨✨✨✨
✨✨✨✨✨✨🇨🇳✨✨✨✨✨🇨🇳✨✨✨✨✨✨✨
✨✨✨✨✨🇨🇳🇨🇳✨✨✨✨✨✨🇨🇳🇨🇳✨✨✨✨✨
✨✨✨✨🇨🇳🇨🇳✨✨✨✨✨✨✨✨🇨🇳🇨🇳🇨🇳✨✨✨
✨✨✨🇨🇳✨🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳✨🇨🇳🇨🇳🇨🇳✨
✨✨🇨🇳✨✨✨✨✨✨🇨🇳✨✨✨✨✨✨✨🇨🇳✨✨
✨✨✨✨✨✨✨✨✨🇨🇳✨✨✨✨✨✨✨✨✨✨
✨✨✨✨✨✨✨✨✨🇨🇳✨✨✨✨✨✨✨✨✨✨
✨✨✨✨✨✨✨✨✨🇨🇳✨✨✨✨🇨🇳🇨🇳✨✨✨✨
✨✨✨✨🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳✨✨✨✨✨✨
✨✨✨✨✨✨✨✨✨🇨🇳✨✨✨✨✨✨✨✨✨✨
✨✨✨✨✨✨✨✨✨🇨🇳✨✨✨✨✨✨✨✨✨✨
✨✨✨✨✨✨✨✨✨🇨🇳✨✨✨✨✨✨✨✨✨✨
✨✨🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳✨✨
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✨✨

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值