如何在pyGame中加载五颜六色的表情包? [英] How to load colorful emojis in pygame?
本文介绍了如何在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')
最小示例:
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屋!
查看全文