8

透明度を指定してアルファで画像を表示したいのですが、どうすればいいのかわかりません。

私がこれにどのように苦労しているのかを詳しく説明するために、以下の宣伝文はこのSO回答からのコードのわずかに変更された塊ですが、実行すると、「画像」はネイティブアルファを失い、「 image2 "は決して変わりません!うん。

#!/usr/bin/env python

import pygame, sys

pygame.init()

window = pygame.display.set_mode((200, 200))
background = pygame.Surface((window.get_size()))
background.fill((255, 255, 255))
image = image2 = pygame.image.load('alpha.png')

image = image.convert()
rect = image.get_rect()

image2 = image2.convert_alpha()
rect2 = image2.get_rect()

rect2.left = rect.width + 1

i = 0
while True:
  for event in pygame.event.get():
    if event.type == 12:
      pygame.quit()
      sys.exit()

  image.set_alpha(i)
  image2.set_alpha(i)

  window.fill((255, 255, 255))
  window.blit(background, background.get_rect())
  window.blit(image, rect)
  window.blit(image2, rect2)

  if i == 255:
    i = 0
  else:
    i += 1

  pygame.display.update()
  pygame.time.Clock().tick(60)

それで...それはどのように行われますか?

4

4 に答える 4

15

表示する画像のコピーを作成し (元の画像を変更しないように)、次を使用します。

self.image = self.original_image.copy()
# this works on images with per pixel alpha too
alpha = 128
self.image.fill((255, 255, 255, alpha), None, pygame.BLEND_RGBA_MULT)

申し訳ありませんが、完全な例を提供していません。

于 2013-04-23T19:43:43.760 に答える
1

コードは少し複雑です:-)それでも、「ピクセルごとではない」-またはサーフェスの「グローバルアルファ」は、Pygameで正しく実行するのが難しいです。

それはすべてhttp://www.pygame.org/docs/ref/surface.htmに文書化されていますが、実際、言葉や例は短いです。

ブリッティングしているサーフェス(ソース)にピクセル自体のアルファピクセル値(つまり、32ビット深度)がある場合、サーフェスのset_alphaメソッドで設定された「グローバルアルファ」値は無視されます。

この「グローバル」アルファを使用するには、ソースサーフェスにピクセルごとのアルファがあってはなりません。元の画像(この場合は「alpha.png」ファイル)が透明度自体を使用していない場合、これは簡単に実現できます。

import pygame
pygame.init()
window = pygame.display.set_mode((200, 200))
image = pygame.image.load('alpha.png').convert(24)
image.set_alpha(128)
window.fill((255,255,255))
window.blit(image, (0,0))
pygame.display.flip()

ただし、「alpha.png」が透明度自体を使用していて、それを保持する場合は、注意が必要です。

次のことを行う必要があります。画像と同じサイズで、奥行き= 24の別のサーフェスを作成します。そのサーフェスを、画像で使用されていない色(「クロマキー」など)で塗りつぶします。ビデオエ​​フェクトでは、通常、純粋な緑またはそのための真っ白ですが、任意のRGB値を選択できます。画像がピクセルアートではなく写真の場合、ウィッチ値が使用されないことを知ることはできません。いずれかを選択するだけで、「失敗したピクセル」が多すぎないようにできます。したがって、サーフェスをこのキーカラーで塗りつぶし、サーフェスのキーカラーとして設定します。そのcolroは、ブリット時に完全に透明になります。次に、この中間サーフェスで元の画像をブリットし、その上にグローバルアルファ(set_alpha)を設定して、目的のサーフェスにブリットします。

コードでは、大まかに次のように変換されます。

import pygame
pygame.init()
window = pygame.display.set_mode((200, 200))
image = pygame.image.load('alpha.png')
surface = pygame.Surface(image.get_size(), depth=24)
key = (0,255,0)
surface.fill(surface.get_rect(), key)
surface.set_colorkey(key)
surface.blit(image, (0,0))
surface.set_alpha(128) 
window.fill((255,255,255))
window.blit(surface, (0,0))
pygame.display.flip()
于 2012-10-14T07:44:12.760 に答える