Syn*_*ead 6 python pygame alpha blit geometry-surface
我想显示具有指定透明度的alpha图像,但无法弄清楚如何操作.
为了详细说明我是如何努力的,下面的模糊是这个SO答案的一个稍微修改的代码块,但如果你运行它,你会看到"图像"丢失它的原生alpha,而" image2"永远不会改变!呸.
#!/usr/bin/env python
import pygame, sys
pygame.init()
window = pygame.display.set_mode((200, 200))
background = pygame.Surface((window.get_size()))
background.fill((255, 255, 255))
image = image2 = pygame.image.load('alpha.png')
image = image.convert()
rect = image.get_rect()
image2 = image2.convert_alpha()
rect2 = image2.get_rect()
rect2.left = rect.width + 1
i = 0
while True:
for event in pygame.event.get():
if event.type == 12:
pygame.quit()
sys.exit()
image.set_alpha(i)
image2.set_alpha(i)
window.fill((255, 255, 255))
window.blit(background, background.get_rect())
window.blit(image, rect)
window.blit(image2, rect2)
if i == 255:
i = 0
else:
i += 1
pygame.display.update()
pygame.time.Clock().tick(60)
Run Code Online (Sandbox Code Playgroud)
那么......怎么做的?
DR0*_*0ID 14
制作要显示的图像的副本(不更改原始图像)并使用以下内容:
self.image = self.original_image.copy()
# this works on images with per pixel alpha too
alpha = 128
self.image.fill((255, 255, 255, alpha), None, pygame.BLEND_RGBA_MULT)
Run Code Online (Sandbox Code Playgroud)
对不起,没有提供完整的示例.
如果您只是想在 pygame 中加载图像以使其具有 Alpha 通道,请按以下步骤操作:
self.image = pygame.image.load("image file path").convert_alpha()
Run Code Online (Sandbox Code Playgroud)
当您在屏幕上绘制此图像时,它应该包含透明度。
对于它的价值,我看到了不同的结果,具体取决于图像本身。在我的情况下,我发现使用 Gimp 更改图像可以使代码保持简单:
image = pygame.image.load('path/to/my.png').convert()
image.set_alpha(128)
surface.blit(image, (0, 0))
Run Code Online (Sandbox Code Playgroud)
使用该代码,以下精灵无法正常工作:http : //www.spriters-resource.com/resources/sheets/47/50365.png
但是,它在使用 Gimp 更改两件事后确实有效:
保存更改后,它在 Ubuntu 中对我有用。我无法发布结果的图像,因为我是新用户...
你的代码有点复杂:-)但是尽管如此,表面的“非每像素”或“全局阿尔法”很难在 Pygame 中正确完成。
这一切都记录在http://www.pygame.org/docs/ref/surface.htm - 但实际上,文字或示例都很简短。
发生的情况是,如果您正在位图传输的表面(源)具有像素本身的 alpha 像素值(即 32 位深度),则由表面的 set_alpha 方法设置的“全局 alpha”值将被忽略。
对于要使用的“全局”alpha,源表面不得具有每像素 alpha。如果您的原始图像(在您的情况下为“alpha.png”文件)本身不使用透明度,那么这很容易实现 - 只需要:
import pygame
pygame.init()
window = pygame.display.set_mode((200, 200))
image = pygame.image.load('alpha.png').convert(24)
image.set_alpha(128)
window.fill((255,255,255))
window.blit(image, (0,0))
pygame.display.flip()
Run Code Online (Sandbox Code Playgroud)
但是,如果您的“alpha.png”本身确实使用透明度,并且您打算保留它,则会变得更加棘手!
您必须: 创建另一个表面,其大小与图像相同,深度 = 24 用图像中未使用的颜色填充该表面(例如“色度键”) - 在视频效果中,通常他们使用纯绿色或纯白色,但您可以选择任何 RGB 值 - 如果您的图像是照片而不是像素艺术,您将无法知道女巫值不会被使用。任意选择即可,希望不要有太多“失败像素”。因此,使用此关键颜色填充表面,并将其设置为表面的关键颜色:该颜色在位图传送时将呈现完全透明。然后,只需将您的原始图像 blit 到这个中间表面上,在其上设置全局 alpha (set_alpha) 并将 blitit 到您的目标表面
在代码中,它大致翻译为:
import pygame
pygame.init()
window = pygame.display.set_mode((200, 200))
image = pygame.image.load('alpha.png')
surface = pygame.Surface(image.get_size(), depth=24)
key = (0,255,0)
surface.fill(surface.get_rect(), key)
surface.set_colorkey(key)
surface.blit(image, (0,0))
surface.set_alpha(128)
window.fill((255,255,255))
window.blit(surface, (0,0))
pygame.display.flip()
Run Code Online (Sandbox Code Playgroud)