8

我想显示具有指定透明度的 alpha 图像,但不知道该怎么做。

为了详细说明我是如何解决这个问题的,下面的简介是来自这个 SO 答案的稍微修改的代码块,但是如果你运行它,你会看到“图像”失去了它的原生 alpha,而“的 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)

那么......它是如何完成的?

4

4 回答 4

15

制作您要显示的图像的副本(不更改原始图像)并使用以下内容:

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)

抱歉,没有提供完整的示例。

于 2013-04-23T19:43:43.760 回答
7

对于它的价值,我看到了取决于图像本身的不同结果。在我的情况下,我发现使用 Gimp 更改图像可以让我保持代码简单:

image = pygame.image.load('path/to/my.png').convert()
image.set_alpha(128)
surface.blit(image, (0, 0))

使用该代码,以下精灵无法正常工作: http ://www.spriters-resource.com/resources/sheets/47/50365.png

但是,在使用 Gimp 更改两件事后它确实有效:

  1. 图像 -> 模式 -> 转换为颜色配置文件...并使用默认值
  2. Image -> Mode -> Indexed... 并使用默认值

保存更改后,它在 Ubuntu 中对我有用。我不能发布结果的图片,因为我是新用户...

于 2015-05-16T13:33:27.113 回答
5

如果您只是想在 pygame 中加载图像以使其具有 alpha 通道,请执行以下操作:

self.image = pygame.image.load("image file path").convert_alpha()

当您在屏幕上绘制此图像时,它应该包括透明度。

于 2013-11-17T22:18:26.670 回答
1

您的代码有点复杂 :-) 但尽管如此,表面的“非每像素”或“全局 alpha”很难在 Pygame 中正确完成。

这一切都记录在http://www.pygame.org/docs/ref/surface.htm - 但实际上,文字或示例都很短。

发生的情况是,如果您要进行 blitting 的表面(源)具有像素本身的 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()

但是,如果您的“alpha.png”本身确实使用了透明度,并且您打算保留它,那就更棘手了!

您必须: 创建另一个与图像大小相同的表面,深度 = 24 用图像中使用的颜色填充该表面(如“色度键”) - 在视频效果中,通常使用纯绿色或纯白色,但您可以选择任何 RGB 值 - 如果您的图像是照片而不是像素艺术,您将无法知道女巫值不会被使用。随便挑一个,希望不要有太多的“失败像素”。所以,用这个关键颜色填充你的表面,并将它设置为表面的关键颜色:在 blitting 时,该颜色将呈现完全透明。然后,只需在此中间表面上对原始图像进行 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()
于 2012-10-14T07:44:12.760 回答