は、私は表面を持っている:pygameでサーフェスのグレースケールコピーを作成するにはどうしたらいいですか? pygameので
im = pygame.image.load('foo.png').convert_alpha()
im = pygame.transform.scale(im, (64, 64))
はどのようにして、画像のグレースケールのコピーを取得、または画像データがグレースケールに変換することができますか?私は気が狂っている。
は、私は表面を持っている:pygameでサーフェスのグレースケールコピーを作成するにはどうしたらいいですか? pygameので
im = pygame.image.load('foo.png').convert_alpha()
im = pygame.transform.scale(im, (64, 64))
はどのようにして、画像のグレースケールのコピーを取得、または画像データがグレースケールに変換することができますか?私は気が狂っている。
はSurfarrayを使用し、numpyのか数値でそれをフィルタリング:
def grayscale(self, img):
arr = pygame.surfarray.array3d(img)
#luminosity filter
avgs = [[(r*0.298 + g*0.587 + b*0.114) for (r,g,b) in col] for col in arr]
arr = numpy.array([[[avg,avg,avg] for avg in col] for col in avgs])
return pygame.surfarray.make_surface(arr)
最も簡単な方法は、画像のすべてのピクセルを繰り返し、.get_at(...)および.set_at(...)を呼び出すことです。
これはかなり遅いので、NumPyの使用に関する暗黙の示唆に答えて、http://www.pygame.org/docs/tut/surfarray/SurfarrayIntro.htmlをご覧ください。概念とコードの大部分は同一です。
あなたの代わりに.array3dの.pixels3d使用している場合は、新しい表面にすべてのデータをコピー避けることができます。 – imallett
同じロジックを使用してこれを高速化するには、 'arr = arr.dot([0.298、0.587、0.114])[:、:、None] .repeat(3、axis = 2); return pygame.surfarrary.make_surface(arr) '。私の(800x600)テスト画像では、これは2桁以上のスピードでスピードアップします。 – Jason