2016-11-18 84 views
1

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

Я пробовал поиск документации, но не стал много, поэтому я прошу здесь посмотреть, не пропустил ли я что-нибудь. При необходимости я могу использовать матрицы преобразования.

Вот пример того, что я хочу добиться: Example

+0

где вы нашли многоугольник с изображением в PyGame ??? Или, может быть, вы имеете в виду OpenGL. – furas

+0

@furas Да? Нет, я уверен, что имел в виду PyGame. –

+0

Увидев ваши обновления и изображения, **, что ** может быть сложнее делать только в pygame. Вы можете попытаться взглянуть на [this] (http://stackoverflow.com/a/14178717/2588654) ответ с помощью PIL. Вы можете загрузить изображение в PIL/pillow, выполнить преобразование там, а затем преобразовать изображение PIL в изображение pygame. Кроме того, вы можете использовать PyOpenGL с Pygame, и вы можете передавать произвольные матрицы преобразования, чтобы повернуть изображение, но это означало бы потерю многих других тонкостей рендеринга модели pygame SDL. Дайте мне знать, если это поможет, или если это пока неясно. – CodeSurgeon

ответ

0

Я думаю, что концепция вы ищете является растровой маской. Используя специальный режим смешивания, 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() 

результат выглядит следующим образом, используя простой треугольник в качестве маски Polygonally-masked Image

Некоторые вещи, чтобы отметить:

  • Этот ответ основан прочь this, которые вы могли бы быть заинтересованы, если вы хотите более сложные маски, чем многоугольники (например, симпатичных растровые маски).
  • Это решение не использует модуль pygame.mask!
  • Я еще не полностью протестировал этот код, но я подозреваю, что это будет работать только для convex полигонов, что может быть значительным ограничением. Я не уверен, что pygame может рисовать вогнутые полигоны, но я знаю, что PyOpenGL может использовать трюки для трафарета или тесселяцию. Дайте мне знать, если вы заинтересованы в этом подходе.
  • Хотя я пытался избавиться от сглаживания, результаты все еще не вполне удовлетворительны.
+0

Спасибо за ответ, и я думаю, что это будет удобно в будущем. Однако об этом я не спрашивал. Я имел в виду растягивание изображения, а не отсечение его. Если мой вопрос неясен, я извиняюсь. Я добавлю картинку, чтобы проиллюстрировать, что я имею в виду. –

+0

Да картинка 1000 слов, так что определенно добавьте ее!Я не был полностью уверен в том, что вы имели в виду в своем первоначальном вопросе. – CodeSurgeon