2016-11-18 80 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