Nano Hash - криптовалюты, майнинг, программирование

Нарисуйте прозрачный прямоугольник в pygame

Как нарисовать прямоугольник с альфа-каналом? У меня есть:

windowSurface = pygame.display.set_mode((1000, 750), pygame.DOUBLEBUF)
pygame.draw.rect(windowSurface, pygame.Color(255, 255, 255, 128), pygame.Rect(0, 0, 1000, 750))

Но я хочу, чтобы белый прямоугольник был прозрачным на 50%, но альфа-значение не работает.

14.06.2011

  • Вам нужно добавить больше кода, так как строка выше выглядит нормально. Либо что-то не так с инициализацией окна, так что оно не поддерживает альфа-канал, либо вы на самом деле рисуете прямоугольник несколько раз, не очищая экран, так что прямоугольник выглядит непрозрачным. 14.06.2011
  • Вам тоже нужен pygame.init? 14.06.2011
  • Хм, поскольку вы явно не указываете битовую глубину, вы можете попробовать windowSurface = pygame.display.set_mode((1000, 750), pygame.DOUBLEBUF, 32). Только 32-битные поверхности поддерживают альфа-канал. 14.06.2011
  • Тогда вам нужно добавить еще код. Можете ли вы разместить свой основной цикл там, где вы рисуете? 14.06.2011

Ответы:


1

pygame.draw функции не будут рисовать с альфа-каналом. В документации говорится:

Большинство аргументов принимают аргумент цвета, который является триплетом RGB. Они также могут принимать четверку RGBA. Значение альфа будет записано непосредственно в поверхность, если оно содержит альфа-канал пикселей, но функция рисования не будет рисовать прозрачно.

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

s = pygame.Surface((1000,750))  # the size of your rect
s.set_alpha(128)                # alpha level
s.fill((255,255,255))           # this fills the entire surface
windowSurface.blit(s, (0,0))    # (0,0) are the top-left coordinates

or,

s = pygame.Surface((1000,750), pygame.SRCALPHA)   # per-pixel alpha
s.fill((255,255,255,128))                         # notice the alpha value in the color
windowSurface.blit(s, (0,0))

Имейте в виду, что в первом случае все, что вы рисуете в s, будет скопировано с указанным вами альфа-значением. Так что, если вы используете это, например, для рисования элементов управления наложением, вам может быть лучше использовать вторую альтернативу.

Также рассмотрите возможность использования pygame.HWSURFACE для создания поверхности с аппаратным ускорением.

Ознакомьтесь с документацией по Surface на сайте pygame, особенно с введением.

14.06.2011

2

К сожалению, нет хорошего способа нарисовать прозрачную фигуру. См. Модуль pygame.draw:

Альфа-значение цвета будет записано непосредственно на поверхность [...], но функция рисования не будет рисовать прозрачно.

Следовательно, вам нужно сделать обходной путь:

  1. Создайте объект pygame.Surface с пиксельным альфа-форматом, достаточно большим, чтобы покрыть форму. .
  2. Нарисуйте фигуру на _Surface.
  3. Совместите поверхность с целевой поверхностью. blit() по умолчанию смешивает 2 поверхности

Например, 3 функции, которые могут рисовать прозрачные прямоугольники, круги и многоугольники:

def draw_rect_alpha(surface, color, rect):
    shape_surf = pygame.Surface(pygame.Rect(rect).size, pygame.SRCALPHA)
    pygame.draw.rect(shape_surf, color, shape_surf.get_rect())
    surface.blit(shape_surf, rect)
def draw_circle_alpha(surface, color, center, radius):
    target_rect = pygame.Rect(center, (0, 0)).inflate((radius * 2, radius * 2))
    shape_surf = pygame.Surface(target_rect.size, pygame.SRCALPHA)
    pygame.draw.circle(shape_surf, color, (radius, radius), radius)
    surface.blit(shape_surf, target_rect)
def draw_polygon_alpha(surface, color, points):
    lx, ly = zip(*points)
    min_x, min_y, max_x, max_y = min(lx), min(ly), max(lx), max(ly)
    target_rect = pygame.Rect(min_x, min_y, max_x - min_x, max_y - min_y)
    shape_surf = pygame.Surface(target_rect.size, pygame.SRCALPHA)
    pygame.draw.polygon(shape_surf, color, [(x - min_x, y - min_y) for x, y in points])
    surface.blit(shape_surf, target_rect)

Минимальный пример:  repl.it/@Rabbid76/PyGame-TransparentShapes

import pygame

def draw_rect_alpha(surface, color, rect):
    shape_surf = pygame.Surface(pygame.Rect(rect).size, pygame.SRCALPHA)
    pygame.draw.rect(shape_surf, color, shape_surf.get_rect())
    surface.blit(shape_surf, rect)

def draw_circle_alpha(surface, color, center, radius):
    target_rect = pygame.Rect(center, (0, 0)).inflate((radius * 2, radius * 2))
    shape_surf = pygame.Surface(target_rect.size, pygame.SRCALPHA)
    pygame.draw.circle(shape_surf, color, (radius, radius), radius)
    surface.blit(shape_surf, target_rect)

def draw_polygon_alpha(surface, color, points):
    lx, ly = zip(*points)
    min_x, min_y, max_x, max_y = min(lx), min(ly), max(lx), max(ly)
    target_rect = pygame.Rect(min_x, min_y, max_x - min_x, max_y - min_y)
    shape_surf = pygame.Surface(target_rect.size, pygame.SRCALPHA)
    pygame.draw.polygon(shape_surf, color, [(x - min_x, y - min_y) for x, y in points])
    surface.blit(shape_surf, target_rect)

pygame.init()
window = pygame.display.set_mode((250, 250))
clock = pygame.time.Clock()

background = pygame.Surface(window.get_size())
ts, w, h, c1, c2 = 50, *window.get_size(), (160, 160, 160), (192, 192, 192)
tiles = [((x*ts, y*ts, ts, ts), c1 if (x+y) % 2 == 0 else c2) for x in range((w+ts-1)//ts) for y in range((h+ts-1)//ts)]
for rect, color in tiles:
    pygame.draw.rect(background, color, rect)

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    window.blit(background, (0, 0))

    draw_rect_alpha(window, (0, 0, 255, 127), (55, 90, 140, 140))
    draw_circle_alpha(window, (255, 0, 0, 127), (150, 100), 80)
    draw_polygon_alpha(window, (255, 255, 0, 127), 
        [(100, 10), (100 + 0.8660 * 90, 145), (100 - 0.8660 * 90, 145)])

    pygame.display.flip()

pygame.quit()
exit()
01.11.2020

3

Максимум, что я могу сделать, чтобы помочь вам, - это показать вам, как нарисовать незакрашенный прямоугольник. Линия для прямоугольника следующая:

pygame.draw.rect(surface, [255, 0, 0], [50, 50, 90, 180], 1)

"1" означает, что он не заполнен

06.01.2019
  • На самом деле не отвечает на вопрос, но помог мне нарисовать прозрачный прямоугольник с рамкой: D 20.02.2021

  • 4

    Чтобы сделать это, вместо рисования прямоугольника с помощью pygame вы можете создать изображение прозрачного прямоугольника с помощью программы рисования, такой как paint.net или Fire Alpaca.

    12.01.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..


    © 2024 nano-hash.ru, Nano Hash - криптовалюты, майнинг, программирование