当前位置: 首页 > 面试题库 >

如何在PyGame中使用Alpha通道渲染透明文本?

颜杰
2023-03-14
问题内容

pygame.font.Font.render()用来渲染一些文本。我希望文本是半透明的,即具有不为255的alpha值,因此我尝试传递带有alpha值(255, 0, 0, 150)的color参数(例如)作为color参数pygame.font.Font.render()但是它没有任何作用。我也尝试pygame.Surface.convert_alpha()在生成的Surface对象上使用,但这也没有执行任何操作。有任何想法吗?


问题答案:

使用pygame.font模块时,渲染文本时不会考虑文本颜色的Alpha通道,但请参见pygame.font.Font.render

抗锯齿图像被渲染为24位RGB图像。如果背景是透明的,则将包含像素alpha。


pygame.Surface.set_alpha

在pygame 2.0中进行了更改:可以将每个表面的alpha与每个像素的alpha组合在一起。

因此,用渲染文本后设​​置透明度就足够了set_alpha。这甚至适用于抗锯齿的文本:

font = pygame.font.SysFont(None, 150)

text_surf = font.render('test text', True, (255, 0, 0))
text_surf.set_alpha(127)

window.blit(text_surf, (x, y))

最小示例: [![](https://i.stack.imgur.com/5jD0C.png) repl.it/@Rabbid76/PyGame- TransparentText](https://repl.it/@Rabbid76/PyGame-TransparentText#main.py)

import pygame

pygame.init()
window = pygame.display.set_mode((500, 300))
clock = pygame.time.Clock()
font = pygame.font.SysFont(None, 150)

text_surf = font.render('test text', True, (255, 0, 0))
text_surf.set_alpha(127)

background = pygame.Surface(window.get_size())
ts, w, h, c1, c2 = 50, *window.get_size(), (128, 128, 128), (64, 64, 64)
tiles = [((x*ts, y*ts, ts, ts), c1 if (x+y) % 2 == 0 else c2) for x in range((w+ts-1)//ts) for y in range((h+ts-1)//ts)]
for rect, color in tiles:
    pygame.draw.rect(background, color, rect)

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

    window.blit(background, (0, 0))
    window.blit(text_surf, text_surf.get_rect(center = window.get_rect().center))
    pygame.display.flip()

pygame.quit()
exit()

通过使用该pygame.freetype模块,可以在创建文本表面时直接使用透明颜色:

ft_font = pygame.freetype.SysFont('Times New Roman', 150)

text_surf2, text_rect2 = ft_font.render('test text', (255, 0, 0, 128))
window.blit(text_surf2, (x, y))

或者,如果将文本直接渲染到曲面上:

ft_font = pygame.freetype.SysFont('Times New Roman', 150)

ft_font.render_to(window, (x, y), 'test text', (255, 0, 0, 128))

最小示例: [![](https://i.stack.imgur.com/5jD0C.png) repl.it/@Rabbid76/PyGame- TransparentFreeTypeText](https://repl.it/@Rabbid76/PyGame- TransparentFreeTypeText#main.py)

import pygame
import pygame.freetype

pygame.init()

window = pygame.display.set_mode((500, 300))
clock = pygame.time.Clock()
ft_font = pygame.freetype.SysFont('Times New Roman', 150)

text_surf2, text_rect2 = ft_font.render('test text', (255, 0, 0, 128))

background = pygame.Surface(window.get_size())
ts, w, h, c1, c2 = 50, *window.get_size(), (128, 128, 128), (64, 64, 64)
tiles = [((x*ts, y*ts, ts, ts), c1 if (x+y) % 2 == 0 else c2) for x in range((w+ts-1)//ts) for y in range((h+ts-1)//ts)]
for rect, color in tiles:
    pygame.draw.rect(background, color, rect)

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

    window.blit(background, (0, 0))

    text_rect = ft_font.get_rect('test text')
    text_rect.center = (window.get_width() // 2, window.get_height() // 2 - 70)
    ft_font.render_to(window, text_rect.topleft, 'test text', (255, 0, 0, 128))

    text_rect2.center = (window.get_width() // 2, window.get_height() // 2 + 70)
    window.blit(text_surf2, text_rect2)

    pygame.display.flip()

pygame.quit()
exit()

另请参阅文本和字体



 类似资料:
  • 我有一个包含透明图标(32位,带alpha通道)的。我想做的是将基于图像索引的单个图标保存为PNG文件,同时保留alpha通道的透明度。使用RAD Studio 2010,因此它具有支持,不需要第三方库。图像从PNG“精灵”图像中加载到TImageList中,使用这里的方法——在运行时使用Delphi XE将png图像添加到图像列表中——因此加载时保留透明度。现在我需要单独保存它们,换句话说,从已

  • 当鼠标不悬停在游戏中时,我试图使游戏中的用户界面透明。但出于某种原因,当我设置图像的alpha值使其变为透明时,什么也没有发生。下面是一些可运行的代码,它复制了问题: 任何帮助都非常感谢!编辑:我收到了一个评论,有人说他们使用了自己的图像,效果很好...当我执行程序时,我会收到这个警告: 是因为我的文件,所以不能正常运行的原因吗?

  • 如何在Android系统中使用为跨文本设置alpha/不透明度?我想在一个

  • 问题内容: 在pyGame应用程序中,我想呈现SVG中描述的无分辨率的GUI小部件。 我可以使用什么工具和/或库来实现此目标? (我喜欢OCEMP GUI工具箱,但它的呈现似乎取决于位图) 问题答案: 这是一个完整的示例,其中结合了其他人的提示。它应该从当前目录渲染一个名为test.svg的文件。它已在Ubuntu 10.10,python-cairo 1.8.8,python-pygame 1.

  • **编辑**我必须导出一个大画布(5Mo 当我导出我的画布(使用toDataUrl)时,它总是返回一个带有alpha通道的. png文件的bas64表示。阿尔法通道权重约为图像数据的25%,我不需要它。 建议的答复: PNG压缩是好的。如果alpha通道是平坦的(所有值都相同),则不会占用太多空间。即使使用完全不透明的alpha通道,也会显示(压缩)。png文件更大。(在一些测试中约为10%) 有

  • 我想渲染一个。但是,当我尝试使用Apache时,它将页面呈现为文本而不是html。 在vhost配置中,如果我尝试呈现索引。php,它可以正确执行。但是当我将DirectoryIndex更改为index时。phtml并尝试呈现索引。phtml存在于公共目录中,它只是呈现文本。 vhost配置为:ServerName parminder。com DocumentRoot“C:/workspace/p