pygameのサーフェスオブジェクトをRGB値の2次元配列(ピクセルごとに1つの値)に変換するにはどうすればよいですか?PixelArraysとSurfarraysのドキュメントを読みましたが、質問に対する答えが見つからないようです。例は大歓迎です。
2 に答える
pygameのドキュメントによると、サーフェスオブジェクトが与えられた場合、次のようにモジュールのメソッドPixelArray
を呼び出すことで、そのピクセルへの直接2D配列アクセスを提供するラッパーを作成できます。PixelArray()
pxarray = pygame.PixelArray(surface)
論理的には、PixelArray
オブジェクトは整数として格納されたRGB値の2次元配列です。
ピクセルアイテムには、生の
PixelArray
整数値、pygame.Color
インスタンス(色表現のオブジェクト)、または(r, g, b[, a])
タプルを割り当てることができます。pxarray[x, y] = 0xFF00FF pxarray[x, y] = pygame.Color(255, 0, 255) pxarray[x, y] = (255, 0, 255)
それはまた言及します:
ただし、返されるのはピクセルの整数値のみです。したがって、ピクセルを特定の色と比較するには、最初に、が作成されたオブジェクトの
Surface.map_rgb()
メソッドを使用して色をマッピングする必要があります。Surface
PixelArray
つまり、次の条件で行われているように、配列への割り当てを行っていないとき、つまりピクセルの値を読み取るときは常に、このメソッドを使用して整数値Surface.map_rgb()
からRGBタプルを取得する必要があります。PixelArray
# Check, if the first pixel at the topleft corner is blue
if pxarray[0, 0] == surface.map_rgb((0, 0, 255)):
...
お役に立てれば。
PixelArrayでSurfaceをラップした後、unmap_rgb関数はピクセルをpygame.Colorオブジェクトに変換できます。
例えば:
import pygame
pygame.init()
image = pygame.image.load('example.png')
pixel = pygame.PixelArray(image)
center = int(image.get_width()/2), int(image.get_height()/2)
colour = image.unmap_rgb(pixel[center])
print(str(colour))
編集:これらすべてのpygame.ColorオブジェクトをRGBタプルの2次元配列に完全に変換するには、次のコードを使用できます。
import pygame
pygame.init()
image = pygame.image.load('example.png')
pixel = pygame.PixelArray(image)
color_array = [[image.unmap_rgb(pixel[x, y]) for x in range(0, image.get_width())] for y in range(0, image.get_height())]
rgb_array = [[(column.r, column.g, column.b) for column in row] for row in color_array]
print(str(rgb_array))
map_rgbを使用する場合(他の回答で提案されているように)、1600万を超えるmap_rgb呼び出し(256 * 256 * 256の可能なRGB値ごとに1つ)に対してすべてのピクセルをテストする必要がある場合があることに注意してください。アルファ値も必要な場合は、可能な値に256を掛けることができます。map_rgbを使用する別の戦略は、(256 ** n)の可能な値からルックアップテーブルを作成し、各ピクセルをテーブルと照合することです。それを行うことは可能ですが、ここに示されているコードははるかに効率的であるように思われます。