如何使用python显示图像,没有pyglet或类似的?

时间:2014-10-29 09:47:54

标签: python image pyglet

那么,我正在努力做的事情: 我有一个充当显示器的设备,虽然在技术上不是一个(这不是很重要,它可以像普通显示器一样处理),我想在其上显示一系列图像。当显示每个图像时,我调用一个从另一个设备读取数据的函数。到目前为止,我已经使用了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)...到(否) ,不,2)并被称为逐个调用。我认为a = b = no / 2的情况也是一个特殊情况,对我的问题并不特别重要。

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

我对此解决方案不满意,因为我所采用的读数似乎总是与之前的图像相对应。 我想我错误地使用了eventloop,但是pyglet文档在这里并没有真正帮助我。 此外,我觉得我正在建造一辆整车,只是为了在街对面搬运行李......

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

我非常感谢正确使用pyglet以及可以提供帮助的替代库。

谢谢你,

Mopsi

2 个答案:

答案 0 :(得分:0)

超长评论,需要格式化代码

从您的示例中,您不需要a,b,c函数之外的update,并且所有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)
...

答案 1 :(得分:0)

好吧,我实际上没有解决问题,但找到了解决方法: 我只是压扁了我的图像命名法,例如

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个测量值分配给值[n-1]。 第一次测量是无用的,这里没有问题,因为值[-1]是最后一个元素,最后会被有意义的测量覆盖。

由于图像的数量是已知的和预定的,我可以在之后重塑我的数组值。

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