2016-11-18 44 views
1

或者,如何用图像填充Pygame中的多边形?如何在Pygame中将图像拉伸成多边形的形状?

我试过搜索文档,但没有多少东西,所以我在这里问,看看我是否错过了任何东西。如果需要,我可以使用变换矩阵。

这里是什么,我想实现一个例子:Example

+0

你在哪里找到PyGame中的图像与多边形?或者你的意思是OpenGL。 – furas

+0

@furas Huh?不,我很确定我的意思是PyGame。 –

+0

看到你的更新和图像,** **可能在pygame中更难做。您可能想尝试使用PIL查看[this](http://stackoverflow.com/a/14178717/2588654)答案。您可以在PIL /枕头中加载图像,在那里执行转换,然后将PIL图像转换为pygame图像。另外,你可以在Pygame中使用PyOpenGL,并且你可以传递任意的转换矩阵来旋转你的图像,但是这意味着会失去很多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模块!
  • 我还没有完全测试过这个代码,但我怀疑这只适用于凸面多边形,这可能是一个重要的限制。我不确定pygame是否可以绘制凹多边形,但我知道PyOpenGL可以使用模板缓冲技巧或镶嵌。请让我知道你是否对这种方法感兴趣。
  • 虽然我试图摆脱锯齿,但结果仍不尽如人意。
+0

感谢您的回答,我认为它将在未来得心应手。但是,那不是我所问的。我的意思是拉伸形象,而不是削减它。如果我的问题不清楚,我很抱歉。我会添加一张照片来说明我的意思。 –

+0

是的图片是1000字,所以一定要加一个!我不完全确定你在最初的问题中的含义。 – CodeSurgeon