2016-11-18 21 views
1

また、Pygameのポリゴンに画像を埋め込む方法はありますか?Pygameで画像をポリゴンの形に伸ばすにはどうすればいいですか?

私はドキュメントを検索しようとしましたが、それほど上向きませんでしたので、私は何かを逃したかどうかここで尋ねています。必要に応じて変換行列を使用できます。 Example

+0

ここで、PyGameの画像でポリゴンを見つけましたか?あるいはOpenGLを意味するかもしれません。 – furas

+0

@furas Huh?いいえ、私はPyGameを意味すると確信しています。 –

+0

あなたのアップデートとイメージを見て、**それはpygameだけでやるのが難しいかもしれません。 PILを使用して[this](http://stackoverflow.com/a/14178717/2588654)の回答を見てみるとよいでしょう。画像をPIL/pillowで読み込んでそこで変換を行い、PIL画像をパイゲーム画像に変換することができます。 PygameでPyOpenGLを使用することもできますが、任意の変換行列を渡して画像を回転させることもできますが、これはpygameのSDLレンダリングモデルの他の多くの点を失うことを意味します。これが助けになるのか、それともまだ不明な場合は私に教えてください。 – CodeSurgeon

答えて

0

私はあなたが探している概念は、ビットマップマスクだと思う:

は、ここで私が達成したいものの例です。特別な混合モード、pygame.BLEND_RGBA_MULTを使用して、の2つのサーフェスの内容を一緒にブレンドすることができます。ここでは、ブレンドすることによって、2つの対応するピクセルのカラー値を単純に掛け合わせて、新しいカラー値を取得できることを意味します。この乗算は正規化されたRGBカラーで行われるため、白((255, 255, 255)は実際に(1.0, 1.0, 1.0)に変換され、マスキングサーフェスとマスクされたサーフェスのピクセル間の乗算が実行され、正規化されていないRGBカラー。

この場合、ポリゴンを1つのサーフェスに描画し、別のサーフェスに描画し、2つをブレンドして最終結果をスクリーンにレンダリングする必要があります。ちょうどそれを行うコード:

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() 

結果をマスクとして、単純な三角形を使用して、このようになります。 0 Polygonally-masked Image

いくつかの点に注意します

  • この答えは、あなたが(例えば、かなりビットマップ・マスクなど)のポリゴンよりも複雑マスクをしたい場合に興味があるかもしれませんthis、のオフに基づいています。
  • この解決方法では、pygame.maskモジュールを使用していません。
  • 私はこのコードをまだ完全にはテストしていませんが、これは凸面ポリゴンでのみ有効であると思われます。 Pygameが凹面ポリゴンを描画できるかどうかはわかりませんが、PyOpenGLはステンシルバッファのトリックやテッセレーションを使用できます。代わりにそのアプローチに興味があれば教えてください。
  • 私はエイリアシングを取り除こうとしましたが、結果はまだ完全に満足できるものではありません。
+0

答えをありがとう、私はそれが将来的には便利だろうと思う。しかし、それは私が求めていたものではありませんでした。私はイメージを伸ばすことを意味し、イメージをカットしていません。私の質問が不明な場合は、お詫び申し上げます。私が意味することを説明するために写真を追加します。 –

+0

はい写真は1000語ですので、間違いなく1語追加してください!私はあなたの最初の質問であなたが何を意味するかについて完全には分かっていませんでした。 – CodeSurgeon

関連する問題