star set_alpha dirtysprite collide_rect python png pygame

python - set_alpha - En Pygame, ¿cómo puedo guardar una imagen transparente sin cabeza en un archivo?



pygame star (1)

Lo he descubierto. La visualización de Pygame debe iniciarse con el canal alfa habilitado. Para arreglar mi ejemplo anterior, simplemente reemplace esta línea en el constructor:

self.screen = pygame.display.set_mode((screen_width, screen_height))

Con este:

self.screen = pygame.display.set_mode((screen_width, screen_height), 0, 32)

Esto sigue a una pregunta que recientemente hice:

En Pygame, ¿cómo puedo guardar una imagen de pantalla en modo sin cabeza?

Puedo guardar imágenes de pantalla que involucran objetos de superficie no transparentes. Sin embargo, la técnica no funciona para objetos de superficie transparentes. El siguiente código ilustra el problema:

import sys import os import pygame from pygame.color import THECOLORS as RGB class PygameProblemDemo(object): def __init__(self): screen_width, screen_height = 200, 200 os.environ[''SDL_VIDEODRIVER''] = ''dummy'' pygame.init() pygame.display.init() self.screen = pygame.display.set_mode((screen_width, screen_height)) def save_non_alpha_image(self): r = 50 color = RGB[''blue''] img_path = ''/tmp/non_alpha_image.png'' background = pygame.Surface((200, 200), pygame.SRCALPHA, 32) pygame.draw.rect(background, RGB[''lightgray''], (0, 0, 200, 200), 0) self.screen.fill(RGB[''black'']) self.screen.blit(background, (0,0)) pygame.draw.circle(self.screen, color, (100,100), r, 0) pygame.image.save(self.screen, img_path) print "image saved to %s" % (img_path) def save_alpha_image(self): r = 50 color = RGB[''blue''] img_path = ''/tmp/alpha_image.png'' background = pygame.Surface((200, 200), pygame.SRCALPHA, 32) pygame.draw.rect(background, RGB[''lightgray''], (0, 0, 200, 200), 0) transparent_circle = self.draw_transparent_circle(r, color, 50) self.screen.fill(RGB[''black'']) self.screen.blit(background, (0,0)) self.screen.blit(transparent_circle, (50,50)) pygame.image.save(self.screen, img_path) print "image saved to %s" % (img_path) def draw_transparent_circle(self, radius, color, transparency=0): """transparency is value between 0 and 100, 0 is opaque, 100 invisible""" width, height = radius*2, radius*2 # transparent base surface flags = pygame.SRCALPHA depth = 32 base = pygame.Surface((width, height), flags, depth) # alpha surface alpha = int(round(255 * (100-transparency) / 100.0)) alpha_surface = pygame.Surface((width, height)) alpha_surface.set_colorkey(RGB[''black'']) alpha_surface.set_alpha(alpha) # draw circle (to alpha surface) pygame.draw.circle(alpha_surface, color, (radius,radius), radius) # draw alpha surface to base surface base.blit(alpha_surface, (0,0)) return base demo = PygameProblemDemo() demo.save_non_alpha_image() demo.save_alpha_image()

Aquí están los resultados:

non_alpha_image.png

alpha_image.png

Actualizar

Si hago un comentario sobre la línea os.environ[''SDL_VIDEODRIVER''] = ''dummy'' en el constructor, la imagen transparente se guarda con éxito:

alpha_image.png

Sin embargo, esa es la línea que evita que la ventana se abra, por lo que el script ya no puede ejecutarse sin cabeza. : /