如何在 Pygame 中将具有一定透明度的 PNG 传输到表面上?

2025-03-21 09:07:00
admin
原创
52
摘要:问题描述:我正在尝试将 PNG 图像传输到表面上,但是由于某种原因,图像的透明部分变黑,以下是简单的代码:screen = pygame.display.set_mode((800, 600), pygame.DOUBLEBUF, 32) world = pygame.Surface((800, 600),...

问题描述:

我正在尝试将 PNG 图像传输到表面上,但是由于某种原因,图像的透明部分变黑,以下是简单的代码:

screen = pygame.display.set_mode((800, 600), pygame.DOUBLEBUF, 32)

world = pygame.Surface((800, 600), pygame.SRCALPHA, 32)
treeImage = pygame.image.load("tree.png")

world.blit(treeImage, (0,0), (0,0,64,64))
screen.blit(world, pygame.rect.Rect(0,0, 800, 600))

我该怎么做才能解决这个问题?图像具有 alpha 透明度,我在 PhotoShop 中打开它,背景变为透明,而不是黑色、白色或任何其他颜色。

感谢您的支持:)


解决方案 1:

http://www.pygame.org/docs/ref/image.html建议:

对于 alpha 透明度,像 .png 图像一样convert_alpha()在加载后使用该方法,以便图像具有每个像素的透明度。

解决方案 2:

您没有翻转双缓冲区。

import pygame
from pygame.locals import Color

screen = pygame.display.set_mode((800, 600))

treeImage = pygame.image.load("tree.png").convert_alpha()

white = Color('white')

while(True):
    screen.fill(white)
    screen.blit(treeImage, pygame.rect.Rect(0,0, 128, 128))
    pygame.display.flip()

这应该可以解决你的问题。

解决方案 3:

图像由“pygame.Surface”对象表示。可以使用以下方法从图像创建Surfacepygame.image.load

my_image_surface = pygame.load.image('my_image.jpg')

但是,pygame 文档指出:

返回的 Surface 将包含与其来源文件相同的颜色格式、colorkey 和 alpha 透明度。您经常希望convert()不带参数调用,以创建一个可以在屏幕上更快速绘制的副本。

对于 alpha 透明度(如 .png 图像),请在加载后使用该convert_alpha()方法,以便图像具有每个像素的透明度。

使用该convert_alpha()方法可获得最佳性能:

alpha_image_surface = pygame.load.image('my_icon.png').convert_alpha()

使用该方法,可以在一个Surface上绘制或与另一个Surfaceblit混合。blit 的第一个参数是要绘制的Surface 。第二个参数是一个元组 ( x , y ),表示左上角或一个矩形。对于矩形,只考虑矩形的左上角。应该提到的是,窗口分别显示也由Surface表示。因此,在窗口中绘制Surface与在Surface上绘制Surface相同:

window_surface.blit(image_surface, (x, y))
window_surface.blit(image_surface,
    image_surface.get_rect(center = window_surface.get_rect().center))

最小示例:![IT科技](https://i.sstatic.net/5jD0C.png) repl.it/@Rabbid76/PyGame-LoadTransparentImage

IT科技

import pygame

pygame.init()
window = pygame.display.set_mode((300, 300))
clock = pygame.time.Clock()

pygameSurface = pygame.image.load('Porthole.png').convert_alpha()

background = pygame.Surface(window.get_size())
ts, w, h, c1, c2 = 50, *window.get_size(), (160, 160, 160), (192, 192, 192)
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(pygameSurface, pygameSurface.get_rect(center = window.get_rect().center))
    pygame.display.flip()

pygame.quit()
exit()

解决方案 4:

您的代码看起来应该是正确的。SDL 库不支持这样的 alpha 到 alpha 块传送,但 Pygame 不久前添加了对它的支持。在 Pygame 1.8 中增加了对自定义混合模式的支持,我想知道这是否会删除 Pygame 的内部 alpha 到 alpha 块传送?

唉,还需要进一步调查。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用