繁体   English   中英

如何在没有pyglet或类似工具的情况下使用python显示图像?

[英]How to display an Image with python, without pyglet or similar?

因此,我想做的很详细:我有一台可以充当显示器的设备,尽管从技术上讲不是一个设备(这并不重要,可以像普通显示器一样处理),但我想显示一系列图像在上面。 当显示每个图像时,我会调用一个从另一个设备获取读数的函数。 到目前为止,我已经使用pyglet了,我可以让它以正确的顺序显示图像并按需要显示它们,但是所获取的读数似乎与正确的图像不符。

解释我要做什么的最简单方法是:

for a in range(10):
    display('image%d'%a)
    values(a) = measure()

想象一下以正确的形式初始化值。

到目前为止,我尝试过的是:

import pyglet
import numpy as np
size = 64
no = 512/size
a,b,c = (0,0,0)
values = np.zeros((no,no,3))
display = pyglet.window.get_platform().get_default_display()
screens = []
for screen in display.get_screens():
    screens.append(screen)
window = pyglet.window.Window(screen = screens[1], fullscreen=1)
#here i choose the mentioned device, since it is connected to my computer via display port
@window.event

def update(dt):
    global a,b,c
    if a == no/2. and b == no/2.:
        values[a,b,c] = 0
        window.clear()
    else:
        image = pyglet.image.load('folder_%d/grating_%d_%d_%d.bmp' % (size,a,b,c))
        window.clear()
        print (a,b,c)
        image.blit(0,0)
        values[a,b,c] = measure()
    c+=1
    if c == 3:
        b += 1
        c = 0
        if b == no:
            a += 1
            b = 0
            if a == no:
                pyglet.app.exit()
pyglet.clock.schedule_interval(update, .2)
pyglet.app.run()

其中measure()是我自己的函数。 “ no”是我的图像的索引,范围从(0,0,0),(0,0,1),(0,0,2),(0,1,0)...到(no ,no,2)并被一一调用。 我认为a = b = no / 2的情况也是特例,对我的问题并不特别重要。

首先:我很确定这既不优雅也不高效,但是我并不是在创造任何其他人都可能使用的软件。 我也知道使用全局变量是一种不好的做法,但是使用它们是由于我不知道如何正确使用事件循环。

我对这种解决方案不满意,因为我所读取的读数似乎总是与上一张图像相对应。 我想我严重滥用了eventloop,但是pyglet文档在这里并没有真正帮助我。 我也觉得自己正在建造一辆整辆卡车,只是为了在街上提着一个袋子。

我已经研究了pyplot作为替代方案,因为imshow()函数以我想要的方式工作,但是绘图库似乎以随机大小显示图像,我无法弄清楚如何正确控制。

感谢您正确使用pyglet所提供的帮助以及可以提供帮助的替代库。

已经谢谢你了

Mopsi

超长注释,需要格式化代码

从您的示例中,您不需要在update功能之外使用a,b,c ,并且所有global内容都涉及使值在调用之间保持有效。 如果我正确的话,这更适合闭包,例如

...
def make_update(no, window):
    from itertools import product
    abcs = product(range(no),range(no),range(3))
    @window.event
    def _update(...):
        try:
            a, b, c = next(abcs)
        except StopIteration:
            ... wind up ...
        ...
    return _update

update = make_update(no, window)
...

好吧,我实际上并没有解决问题,但是找到了一种解决方法:我只是弄平了图像命名法,例如

0_0_0 -> 000
0_0_1 -> 001
0_0_2 -> 002
0_1_0 -> 003
etc.

现在值是尺寸为[no * no * 3,1]的数组

并且由于第n次迭代以及第n次测量,我看到了第(n-1)张图像,因此我仅添加了一个虚拟图像并将第n个测量值分配给values [n-1]。 第一个无用的度量在这里没有问题,因为values [-1]是最后一个元素,最后被有意义的度量覆盖。

由于图像的数量是已知的并且是预先确定的,因此我可以在以后重新调整我的值数组的形状。

如果有人想解释为什么显示的图像没有移动一个迭代(在第一次迭代中根本没有显示图像),请继续。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM