0

我正在使用 Shady 循环显示图像(PILLOW 图像)。为此,我使用以下命令:

Shady.Require( 'numpy', 'Image' )

w = Shady.World(  )

s = w.Stimulus( imList )

s.frame = lambda t: t * 60

其中 imList 是 60 个 PIL 图像的列表。不知何故,Shady 并没有在我的屏幕上产生任何东西。但是,如果我将列表的大小减少到 17,那么它可以工作。

Shady.Require( 'numpy', 'Image' )

w = Shady.World(  )

s = w.Stimulus( imList[0:17] )

s.frame = lambda t: t * 60

我不知道发生了什么事。我是 Shady 的新手,没有太多文档可以阅读以了解发生了什么。我只想循环显示 60 张图像(60 FPS)。我认为上面的代码应该这样做。但它不起作用。任何帮助将不胜感激。我已经坚持了几天了。还有,为什么

s.frame = lambda t: t * 60

意思是60 FPS?我不确定我是否也完全理解这一点。我试图寻找 s.frame 和 lambda 函数的一些解释,但找不到答案。

感谢您的关注!

最好的祝福。

4

1 回答 1

0

来自 Shady 的Stimulus构造函数文档(添加了重点):

multipage(bool) – 如果您将此设置为True,将使用以下方法加载多个图像帧LoadPages():这会将每个帧作为单独的纹理传输到显卡,您可以使用该.page属性在它们之间切换。

相比之下,如果您将其保留为默认值False,则通过将多个图像帧水平连接成一个纹理来处理多个图像帧,并使用该.frame属性在它们之间切换,该属性间接操纵.carrierTranslation.

您可能需要multipage=True用于具有大宽度和/或高帧数的动画图像,因为正常的连接方法可能会导致纹理超过最大允许宽度。

所以:

w = Shady.World()
s = w.Stimulus( imList, multipage=True )
s.page = lambda t: t * 60  # note the use of .page rather than .frame

这也在动画纹理演示中进行了解释。该演示还向您介绍了这个lambda想法,解释了该属性被设置为以秒为单位的时间函数。这个概念在“关键概念”一章“使属性动态化”中有详细解释。(我不确定您最终是如何产生“您可以阅读的文档不多”的印象。)

该特定函数以秒为单位lambda t: t*60占用时间t,将其乘以每秒 60 帧,然后返回结果。如果您将秒数乘以每秒帧数,您会得到一个帧数,这就是s.frame(或s.page) 的预期值。当您分配给.frameor.page时,将自动处理必要的舍入和以可用帧数为模的环绕。

您的动态属性不必是 la​​mbda。它们可以是任何可调用的:一个普通的函数、一个对象方法、一个定义方法的成熟自定义类的实例__call__,......任何你喜欢的,只要它只需要一个参数。Alambda只是一个紧凑且非常单一的选项——请参阅lambdas 有什么用处?

于 2022-01-11T22:38:53.697 回答