如何在缩放,平移,调整大小时更新pyqtgraph图像数据

时间:2015-10-21 14:37:51

标签: pyqtgraph

我正在使用PySide。在QMainWindow内,我在ImageItem内显示了PlotWidget

假设我有一个可以动态生成图像的函数generateImage(r, np)。对于位于np方块内的图像(实际坐标),该函数返回np x (-r, -r)-(r, r)像素数组。我希望轴显示真实坐标,而不是像素坐标。

  1. 如果我放大/缩小,我想生成相同数量的像素,但是在更小/更大的方块内(在实际坐标中);
  2. 如果我翻译图像,我需要生成一个更大的正方形和更多像素的图像,以使用相同的分辨率显示感兴趣的区域;
  3. 如果我调整窗口大小,我需要生成不同数量的像素,以保持显示图像的分辨率相同。
  4. 我的代码实际上是这样的:

    graph = PlotWidget()
    image = ImageItem()
    graph.addItem(image)
    graph.setAspectLocked(True)  # to keep the pixels square
    
    r = 10e-6  # 10 µm
    np = 101  # but should be related to number of pixels in the window
    image.setImage(generateImage(r, np))
    image.setRect(QRectF(-r, -r, 2*r, 2*r))
    

    我的猜测是使用sigRangeChanged信号来检测视图中的更改。但是,我不确定如何检测窗口的大小和分辨率,以及如何正确更新图像。

    我天真地试图做这样的事情:

    graph.sigRangeChanged.connect(updateRange)
    
    def updateRange(view, rng):
        r = max(abs(rng[0][0]), abs(rng[0][1]),
                abs(rng[1][0]), abs(rng[1][1]))
        image.setImage(generateImage(r, np))
        image.setRect(QRectF(-r, -r, 2*r, 2*r))
    

    但是,它不起作用,因为信号返回的范围略大于r本身。因此,我看到图像变得越来越小......

    • 如何确定填充窗口所需的像素数?
    • 如何确定需要生成的图像大小(以实际坐标为单位)
    • 如何在不递归更新图像范围的情况下更新显示的内容?
    • 如何仅显示生成图像的一部分?在将数组提供给setImage()之前是否需要对数组进行切片,还是可以给出整个数组并让pyqtgraph只显示我需要的区域?
    • 更一般地说,不同元素的坐标与转换之间的关系是什么(graph.viewRect()image.viewRect()image.boundingRect()image.sceneBoundingRect(),......)

0 个答案:

没有答案