如何在PyQt4中滚动显示RGBA numpy数组图像?

时间:2016-02-01 17:27:01

标签: python pyqt

我想在我的自定义窗口中显示PyQt4中的两个图像。在左侧,是源图像。在右侧,转换后的转换将是像素方式 - 图像。图像将采用由PIL(低)加载的RGBA格式,以及numpy(scipy.ndimage.imread)。

两个图像具有相同的尺寸(因为变换的图像将从源图像生成),并且两个显示将具有相同的大小(独立于图像大小):

  • 如果图像宽度低于显示屏,图像将在显示屏中以左为中心。如果它更大,我需要滚动显示
  • 高度,顶部居中和垂直滚动条的类似标准。
  • 如果我在源显示中滚动,转换后的显示也会滚动,转换后的显示将没有滚动条。

问题:我可以使用哪个组件来显示具有内部滚动功能的图像 ? (我会对组件名称和一些指导方针感到满意;代码将受到赞赏,但主要概念对于答案来说很重要。)

1 个答案:

答案 0 :(得分:2)

有几种解决方案。如果你只想创建numpy"图像"一次然后显示它,并且它不是太大(或者你不关心内存),你可以简单地将它转换为QPixmap并在视口中显示:{{3 }}

    self.imageLabel = QtGui.QLabel()
    self.imageLabel.setBackgroundRole(QtGui.QPalette.Base)
    self.imageLabel.setSizePolicy(QtGui.QSizePolicy.Ignored,
            QtGui.QSizePolicy.Ignored) # not sure about this one.
    self.imageLabel.setPixmap(...pixmap here...)

    self.scrollArea = QtGui.QScrollArea()
    self.scrollArea.setBackgroundRole(QtGui.QPalette.Dark)
    self.scrollArea.setWidget(self.imageLabel)

(摘自Convert numpy array to PySide QPixmap

如果图像太大,则可以添加绘画钩。在钩子中,获取QScrollArea(视口)的可见部分,将其转换为像素图并渲染它。

当numpy数组一直在变化时也是如此。您需要在更新阵列时触发刷新。然后Qt将调用paint hook,新内容将变为可见。