Как я могу создать изображение с прозрачным фоном в Pygame?

Я новичок в программировании, поэтому купил Ускоренный курс по Python Эрика Маттеса. Недавно я решил воссоздать боевую систему покемонов в Pygame. Пока что я создал достаточно хорошую основу для запуска боевой системы. В качестве подопытного я выбрал Покемона Мяу. У меня уже есть прозрачный фон для изображения, но pygame по-прежнему показывает серые и белые квадраты. Это мой основной код-файл:


from settings import Settings
def run_game():
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Pykemon Battle Simulator")
    pokemon = Mew(screen)
    mixer.music.load("battle_music.mp3")
    mixer.music.play(-1)

    while True:
        screen.fill(ai_settings.bg_color)
        pokemon.blitme()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
        pygame.display.flip()

run_game()

А это мой файл настроек для Mew:

import pygame

class Mew():
    def __init__(self, screen):
        """Initialize the Pokémon Mew and it's location """
        self.screen = screen

        #Load the pokemon and get it's rect.
        self.image = image = pygame.image.load("mew.jpg").convert_alpha()
        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()
        #Start each new Pokemon at the bottom of the screen
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom = self.screen_rect.bottom
    
    def blitme(self):
        """Draw the pokemon's current location"""
        self.screen.blit(self.image, self.rect)

Вот как это оказалось (https://imgur.com/a/OytJBUN). Как сделать фон изображения прозрачным?


person PokemasterLink    schedule 28.06.2020    source источник


Ответы (2)


Проблема в формате изображения. Изображения JPEG не имеют альфа-канала. Вы можете установить прозрачный цветовой ключ с помощью set_colorkey(), но результат вас не удовлетворит, потому что JPEG не без потерь. Это означает, что из-за сжатия цвета немного изменятся, и цветовой ключ не будет работать правильно. Например белый цвет:

self.image = image = pygame.image.load("mew.jpg")
self.image.set_colorkey((255, 255, 255))

Либо используйте set_colorkey(), либо формат изображения без потерь, например BMP:

self.image = image = pygame.image.load("mew.bmp")
self.image.set_colorkey((255, 255, 255))

или нас в формате PNG. Например:

image = pygame.image.load("mew.png").convert_alpha()
person Rabbid76    schedule 28.06.2020
comment
Спасибо за совет ^^ Я пробовал с форматом PNG, но по какой-то причине он работает некорректно (наверное, потому что я тупой, но кто знает) - person PokemasterLink; 04.07.2020
comment
@PokemasterLink Конечно, изображение png должно иметь правильный альфа-канал. Фон прозрачный? - person Rabbid76; 04.07.2020

Используйте PNG с функцией convert_alpha ():

image = pygame.image.load("image.png").convert_alpha()
person Pzet    schedule 28.06.2020