Я думаю, что концепция вы ищете является растровой маской. Используя специальный режим смешивания, pygame.BLEND_RGBA_MULT
, мы можем смешать содержимое двух поверхностей вместе. Здесь, путем смешивания, я имею в виду, что мы можем просто умножить значения цвета двух соответствующих пикселей вместе, чтобы получить новое значение цвета. Это умножение выполняется для нормализованных цветов RGB, поэтому белый (который равен (255, 255, 255)
, будет фактически преобразован в (1.0, 1.0, 1.0)
, тогда будет выполнено умножение между поверхностью маскирования и пикселями маскируемой поверхности, а затем вы будете преобразовывать обратно в ненормированные цвета RGB
В этом случае все это означает, что нам нужно нарисовать многоугольник на одну поверхность, нарисовать изображение, представляющее интерес для другой поверхности, и объединить два вместе и отобразить конечный результат на экране. код, который делает только что:.
import pygame
import sys
(width, height) = (800, 600)
pygame.init()
screen = pygame.display.set_mode((width, height))
image = pygame.image.load("test.png").convert_alpha()
masked_result = image.copy()
white_color = (255, 255, 255)
polygon = [(0, 0), (800, 600), (0, 600)]
mask_surface = pygame.Surface((width, height))
pygame.draw.polygon(mask_surface, white_color, polygon)
pygame.draw.aalines(mask_surface, white_color, True, polygon)#moderately helps with ugly aliasing
masked_result.blit(mask_surface, (0, 0), None, pygame.BLEND_RGBA_MULT)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.blit(masked_result, (0, 0))
pygame.display.update()
результат выглядит следующим образом, используя простой треугольник в качестве маски
Некоторые вещи, чтобы отметить:
- Этот ответ основан прочь this, которые вы могли бы быть заинтересованы, если вы хотите более сложные маски, чем многоугольники (например, симпатичных растровые маски).
- Это решение не использует модуль
pygame.mask
!
- Я еще не полностью протестировал этот код, но я подозреваю, что это будет работать только для convex полигонов, что может быть значительным ограничением. Я не уверен, что pygame может рисовать вогнутые полигоны, но я знаю, что PyOpenGL может использовать трюки для трафарета или тесселяцию. Дайте мне знать, если вы заинтересованы в этом подходе.
- Хотя я пытался избавиться от сглаживания, результаты все еще не вполне удовлетворительны.
где вы нашли многоугольник с изображением в PyGame ??? Или, может быть, вы имеете в виду OpenGL. – furas
@furas Да? Нет, я уверен, что имел в виду PyGame. –
Увидев ваши обновления и изображения, **, что ** может быть сложнее делать только в pygame. Вы можете попытаться взглянуть на [this] (http://stackoverflow.com/a/14178717/2588654) ответ с помощью PIL. Вы можете загрузить изображение в PIL/pillow, выполнить преобразование там, а затем преобразовать изображение PIL в изображение pygame. Кроме того, вы можете использовать PyOpenGL с Pygame, и вы можете передавать произвольные матрицы преобразования, чтобы повернуть изображение, но это означало бы потерю многих других тонкостей рендеринга модели pygame SDL. Дайте мне знать, если это поможет, или если это пока неясно. – CodeSurgeon