如何在pyGame中加载五颜六色的表情包? [英] How to load colorful emojis in pygame?

查看:0
本文介绍了如何在pyGame中加载五颜六色的表情包?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用PyGame的freetype模块通过它的Unicode加载一个五颜六色的表情符号。不幸的是,我只得到了一张带有表情符号轮廓的单色图片:

最小、可重复的示例:

import pygame
import pygame.freetype

pygame.init()
window = pygame.display.set_mode((200, 200))

seguisy80 = pygame.freetype.SysFont("segoeuisymbol", 100)
emoji, rect = seguisy80.render('😃', "black")
rect.center = window.get_rect().center

run = True
while run:  
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    window.fill("lightgray")
    window.blit(emoji, rect)
    pygame.display.flip()

pygame.quit()

如何修改此代码以获得表情符号的完整RGBA彩色图像?

推荐答案

遗憾的是,PYGAME本身并不支持彩色字体加载。但是,有一种解决方法。 首先,你需要一个彩色的表情符号字体。例如,您可以在以下位置下载:Apple Color Emoji for Linux

使用https://freetype.org/加载此字体。安装freetype-py

pip3 install freetype-py 

对于Windows用户,需要指出的是,已安装的程序包不支持该字体,并导致";未实现的功能";异常。 从Unofficial Windows Binaries for Python Extension Packages下载程序包并安装。例如:

pip3 install freetype_py-2.2.0-cp310-cp310-win_amd64.whl

现在您已做好准备,可以从字体加载表情符号。Emojis及其Unicode可以在此处找到:Emoticons (Unicode block)。 复制表情符号或使用Unicode并加载字形:

import freetype

face = freetype.Face("AppleColorEmoji.ttf")
face.set_char_size(int(face.available_sizes[-1].size)) 
    
face.load_char('😀', freetype.FT_LOAD_COLOR) # or face.load_char('U0001F603', freetype.FT_LOAD_COLOR)
现在需要将加载的字形转换为pygame.Surface。为此,请使用NumPy。 问题的答案中详细说明了这是如何工作的:How do I convert an OpenCV (cv2) image (BGR and BGRA) to a pygame.Surface object

import numpy as np

ft_bitmap = face.glyph.bitmap
bitmap = np.array(ft_bitmap.buffer, dtype=np.uint8).reshape((ft_bitmap.rows, ft_bitmap.width, 4))
bitmap[:, :, [0, 2]] = bitmap[:, :, [2, 0]]
emoji = pygame.image.frombuffer(bitmap.flatten(), (ft_bitmap.width, ft_bitmap.rows), 'RGBA')

另见Text and font - Unicode


最小示例:

import pygame
import freetype
import numpy as np

class Emojis:
    def __init__(self):
        self. face = freetype.Face("AppleColorEmoji.ttf")
        self.face.set_char_size(int(self.face.available_sizes[-1].size)) 
    def create_surface(self, unicode):
        self.face.load_char(unicode, freetype.FT_LOAD_COLOR)
        ft_bitmap = self.face.glyph.bitmap
        bitmap = np.array(ft_bitmap.buffer, dtype=np.uint8).reshape((ft_bitmap.rows, ft_bitmap.width, 4))
        bitmap[:, :, [0, 2]] = bitmap[:, :, [2, 0]]
        return pygame.image.frombuffer(bitmap.flatten(), (ft_bitmap.width, ft_bitmap.rows), 'RGBA')

pygame.init()
window = pygame.display.set_mode((200, 200))
emojis = Emojis()

emoji = emojis.create_surface('😃')
#emoji = emojis.create_surface('U0001F603')
rect = emoji.get_rect(center = window.get_rect().center)

run = True
while run:  
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    window.fill("lightgray")
    window.blit(emoji, rect)
    pygame.display.flip()

pygame.quit()

这篇关于如何在pyGame中加载五颜六色的表情包?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆