当前位置 博文首页 > python实战之用emoji表情生成文字

    python实战之用emoji表情生成文字

    作者:x670127565 时间:2021-06-09 18:29

    一、前言

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

    四、效果

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

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