T-L*_*-Lo 4 python arrays numpy pyglet
我在使用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
Run Code Online (Sandbox Code Playgroud)
如果我保存并加载数组而不是它可以工作(但它会慢得多):
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
Run Code Online (Sandbox Code Playgroud)
我得到了我想要的东西:
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
Run Code Online (Sandbox Code Playgroud)
我花了最后一周玩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
Run Code Online (Sandbox Code Playgroud)
使用上面的答案,您将执行以下操作
tex_data = data.astype('uint8').__str__()
Run Code Online (Sandbox Code Playgroud)
如果您尝试使用代码,您将获得所有颜色,而不仅仅是红色!
正确的方法是转换为ctype GLubytes.
# convert to GLubytes
tex_data = (GLubyte * data.size)( *data.astype('uint8') )
Run Code Online (Sandbox Code Playgroud)
然后,您可以将其传递到纹理中.
# 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
)
Run Code Online (Sandbox Code Playgroud)
我认为 pyglet 期待 uint8,你尝试过吗?
IMG = ( random((X,Y)) * 255 ).astype('uint8')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1862 次 |
| 最近记录: |