Python Pygame Trasparency отображается черным цветом

Я пытаюсь скопировать изображение с прозрачными пленками поверх поверхности с остальной частью карты. (Это второй слой.) Когда я его копирую, прозрачность отображается черным цветом. Есть способ исправить это. Я включил связанный с этим код.

lily_tex = spritesheet.get_sprite(1, 4).convert_alpha()

Это получает изображение из таблицы спрайтов.

    img = pygame.Surface((self.tilesize, self.tilesize))
    img.blit(self.img, (0, 0), (x, y, self.tilesize, self.tilesize))
    return img.convert()

И это то, что вытаскивает его из листа спрайтов. Ниже показано, что переносит его на поверхность для переноса в экранный буфер.

def create_map(self):
    for map_data in self.map_data:
        for row in range(len(map_data)):
            for column in range(len(map_data[row])):
                if map_data[row][column] == 0:
                    continue
                texture = self.key.get(map_data[row][column])
                self.map_img.blit(texture, (column * self.tilesize, row * self.tilesize))

Спасибо


person Some Goose    schedule 06.08.2020    source источник
comment
Не уверен, но я предполагаю, что return img.convert() может быть return img.convert_alpha(). Однако, если вы уже convert() отредактировали self.img, вам не нужно преобразовывать изображение / поверхность, полученную в результате блита. Выполнение convert() снова, вероятно, удалит альфа-канал, который был сохранен в исходном convert_alpha()   -  person Glenn Mackintosh    schedule 06.08.2020
comment
Вы можете попробовать: img = pygame.Surface((self.tilesize, self.tilesize), pygame.SRCALPHA). Это создает поверхность с альфа-каналом.   -  person Kingsley    schedule 07.08.2020
comment
Спасибо, посмотрев на это, я добавил convert_alpha() и увидел где-то еще, чтобы добавить img.setcolorkey((0, 0, 0)), поскольку это был цвет фона изображения. Я думаю, что это было необходимо, поскольку изображение могло использовать черный цвет, чтобы показать прозрачность. При просмотре изображения в проводнике иногда оно бывает черным. Поверхность с альфа-каналом могла работать, но я думаю, что это было изображение, а не pygame.   -  person Some Goose    schedule 07.08.2020


Ответы (1)


Когда вы вызываете convert() пиксельный формат изображения изменено. Если формат изображения имеет альфа-пиксель, эта информация будет потеряна.

Используйте convert_alpha() вместо convert():

return img.convert()

return img.convert_alpha()

Если изображение не имеет пиксельного альфа-формата, вы должны установить ключ прозрачного цвета с помощью _ 6_:

img = pygame.Surface((self.tilesize, self.tilesize))
img.blit(self.img, (0, 0), (x, y, self.tilesize, self.tilesize))
img.set_colorkey((0, 0, 0))

В качестве альтернативы вы можете создать поверхность с пиксельным альфа-форматом с флагом SRCALPHA:

img = pygame.Surface((self.tilesize, self.tilesize), pygame.SRCALPHA)
img.blit(self.img, (0, 0), (x, y, self.tilesize, self.tilesize))
person Rabbid76    schedule 30.12.2020