Прозрачное изображение в Pygame - PullRequest
0 голосов
/ 22 мая 2018

У меня есть спрайт в Pygame, который представляет собой синий круг.Я хочу, чтобы это изображение было нарисовано на экране "блеклым", например, полупрозрачным.Однако я не хочу, чтобы поверх него был нарисован полупрозрачный прямоугольник;вместо этого я хочу, чтобы фактическое изображение было изменено и сделано прозрачным.Любая помощь очень ценится!

Сейчас у меня есть:

Class Circle(pygame.sprite.Sprite):

    self.image = self.image = pygame.image.load("circle.png")

circle = Circle()

и в конечном итоге ...

window.blit(pygame.transform.scale(circle.image, (zoom, zoom)), (100, 100))

Как выглядит circle.png:

enter image description here

Как я хочу, чтобы изображение выглядело после его прозрачности:

enter image description here

Я перетаскиваю изображение на окно, которое является белым фоном.

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Как сказано в документации Surface.set_alpha(), у вас могут быть поверхности с "однородной альфа" или альфа-пикселем, но не обе, что, я считаю, то, что вы хотите.Это может работать с прозрачностью цветовых клавиш, но я не уверен (я еще не проверял это).Любой пиксельный формат без RGBA (без активного альфа-канала) может работать, если вы используете set_colorkey() и set_alpha() перед блиттингом.

Итак, код может выглядеть следующим образом:

class Circle(pygame.sprite.Sprite):
    def __init__(self)
        self.image = pygame.image.load("circle.png")
        # get the surface's top-left pixel color and use it as colorkey
        colorkey = self.image.get_at((0, 0))
        self.image.set_colorkey(colorkey)

AtВ какой-то момент в вашем коде (непосредственно перед рендерингом) вы можете установить прозрачность, вызвав:

circle.image.set_alpha(some_int_val)

А затем вы можете масштабировать и перетаскивать его, как и предполагалось.

0 голосов
/ 22 мая 2018

Во-первых, ваше изображение / поверхность должно использовать альфа на пиксель, поэтому при загрузке вызывайте метод convert_alpha().Если вы хотите создать новую поверхность (как в примере), вы также можете передать pygame.SRCALPHA в pygame.Surface.

Второй шаг - создать еще одну поверхность (здесь она называется alpha_surface), которую вызалейте белым и нужным альфа-значением (четвертым элементом цветового кортежа).

Наконец, вам нужно скопировать alpha_surface на ваше изображение и передать pygame.BLEND_RGBA_MULT в качестве аргумента special_flags.Это сделает непрозрачные части изображения прозрачными.

import pygame as pg


pg.init()
screen = pg.display.set_mode((800, 600))
clock = pg.time.Clock()
BLUE = pg.Color('dodgerblue2')
BLACK = pg.Color('black')

# Load your image and use the convert_alpha method to use
# per-pixel alpha.
# IMAGE = pygame.image.load('circle.png').convert_alpha()
# A surface with per-pixel alpha for demonstration purposes.
IMAGE = pg.Surface((300, 300), pg.SRCALPHA)
pg.draw.circle(IMAGE, BLACK, (150, 150), 150)
pg.draw.circle(IMAGE, BLUE, (150, 150), 130)

alpha_surface = pg.Surface(IMAGE.get_size(), pg.SRCALPHA)
# Fill the surface with white and use the desired alpha value
# here (the fourth element).
alpha_surface.fill((255, 255, 255, 90))
# Now blit the transparent surface onto your image and pass
# BLEND_RGBA_MULT as the special_flags argument. 
IMAGE.blit(alpha_surface, (0, 0), special_flags=pg.BLEND_RGBA_MULT)

done = False
while not done:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            done = True

    screen.fill((50, 50, 50))
    pg.draw.rect(screen, (250, 120, 0), (100, 300, 200, 100))
    screen.blit(IMAGE, (150, 150))

    pg.display.flip()
    clock.tick(60)

pg.quit()
0 голосов
/ 22 мая 2018

Создайте новую поверхность с альфа-пиксельным пикселем.

surf = pygame.Surface((circle_width, circle_height), pygame.SRCALPHA)

Сделайте поверхность прозрачной

surf.set_alpha(128)  # alpha value

Нарисуйте окружность на этой поверхности в (x=0, y=0)

surf.blit(pygame.transform.scale(circle.image, (zoom, zoom)), (0, 0))

Нарисуйте поверхность к окну

window.blit(surf, (circle_x, circle_y))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...