5

pyglet で numpy 配列を表示する際に問題があります。私が使用した非常によく似たトピック ( pyglet で numpy 配列を表示する方法は? ) を見つけました。配列をグレースケールで表示したいのですが、pyglet はそれを色で表示します。画像を参照してください: http://i.stack.imgur.com/pL6Yr.jpg

def create(self, X,Y):

    IMG = random((X,Y)) * 255
    self.IMG = dstack((IMG,IMG,IMG))

    return self.IMG

def image(self):

    self.img_data = self.create(X,Y).data.__str__()
    self.image = pyglet.image.ImageData(X,Y, 'RGB', self.img_data, pitch = -X*3)

    return self.image

代わりに配列を保存してロードすると機能します(ただし、非常に遅くなります):

def image(self):

    self.im_save=scipy.misc.toimage(self.create(X,Y),cmin=0, cmax=255)
    self.im_save.save('outfile.png')
    self.image = pyglet.image.load('outfile.png')

    return self.image

そして、私が欲しかったものを手に入れました:

i.stack.imgur.com/FCY1v.jpg

最初のコード例で間違いを見つけることができません:(

編集:

ご回答ありがとうございます。Bago からのヒントを使用して、これをコード化して動作させました :) 実際、行列をグレースケールで表示したいだけなので、nfirvine の提案は合理的です。

def create(self, X,Y):

        self.IMG = (random((X,Y)) * 255).astype('uint8')

        return self.IMG


def image(self):

        self.img_data = self.create(X,Y).data.__str__()
        self.image = pyglet.image.ImageData(X,Y, 'L', self.img_data)

        return self.image
4

4 に答える 4

5

私は先週、NumPy を使ってランダムなテクスチャを生成して遊んでいました。この投稿に出くわし、受け入れられた回答を試しました。

以前に受け入れられた回答が正しくないことを確認できます。

グレースケール画像を使用しているため、正しいようです。しかし、カラー イメージ (たとえば RGBA) を使用し、GBA チャネルをゼロにすると、テクスチャにまだ緑と青が表示されるため、これを発見することになります。

__str__() を使用すると、実際に必要な値ではなく、実際にはゴミが送信されます。

コードを使用してこれを示します。

import numpy
import pyglet
from pyglet.gl import *

# the size of our texture
dimensions = (16, 16)

# we need RGBA textures
# which has 4 channels
format_size = 4
bytes_per_channel = 1

# populate our array with some random data
data = numpy.random.random_integers(
    low = 0,
    high = 1,
    size = (dimensions[ 0 ] * dimensions[ 1 ], format_size)
    )

# convert any 1's to 255
data *= 255
        
# set the GB channels (from RGBA) to 0
data[ :, 1:-1 ] = 0
        
# ensure alpha is always 255
data[ :, 3 ] = 255

# we need to flatten the array
data.shape = -1

上記の答えを使用すると、次のようになります

これをしないでください!

tex_data = data.astype('uint8').__str__()

コードを試してみると、赤だけでなく、すべての色が得られます!

代わりにこれをしてください!

適切な方法は、ctype GLubytes に変換することです。

# convert to GLubytes
tex_data = (GLubyte * data.size)( *data.astype('uint8') )

これをテクスチャに渡すことができます。

# create an image
# pitch is 'texture width * number of channels per element * per channel size in bytes'
return pyglet.image.ImageData(
    dimensions[ 0 ],
    dimensions[ 1 ],
    "RGBA",
    tex_data,
    pitch = dimensions[ 1 ] * format_size * bytes_per_channel
    )
于 2012-08-14T02:33:03.437 に答える
1

pygletはuint8を期待していると思いますが、試しましたか?

IMG = ( random((X,Y)) * 255 ).astype('uint8')
于 2012-01-27T23:33:58.107 に答える
1

の Pyglet docs にpyglet.imageよると、グレースケールが必要な場合は、チャンネルが 1 つしかないため、'L'ではなくフォーマット コードを使用する必要があります。'RGB'

于 2012-01-27T23:29:09.980 に答える