From 5a29373572fcf60489d2ae85a151950004170171 Mon Sep 17 00:00:00 2001 From: KIU Shueng Chuan Date: Sat, 20 Feb 2021 18:42:13 +0800 Subject: [PATCH 1/2] fix: make transpose work for either ndim 2 or 3 at the same time, increase performance by using makeQImage(copy=False, transpose=False) --- pyqtgraph/widgets/RawImageWidget.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pyqtgraph/widgets/RawImageWidget.py b/pyqtgraph/widgets/RawImageWidget.py index ca9db363..fb1a1e33 100644 --- a/pyqtgraph/widgets/RawImageWidget.py +++ b/pyqtgraph/widgets/RawImageWidget.py @@ -6,10 +6,10 @@ Distributed under MIT/X11 license. See license.txt for more infomation. """ from .. import getConfigOption, functions as fn, getCupy -from ..Qt import QtCore, QtGui +from ..Qt import QtCore, QtGui, QtWidgets try: - from ..Qt import QtWidgets + QOpenGLWidget = QtWidgets.QOpenGLWidget from OpenGL.GL import * HAVE_OPENGL = True @@ -43,8 +43,8 @@ class RawImageWidget(QtGui.QWidget): img must be ndarray of shape (x,y), (x,y,3), or (x,y,4). Extra arguments are sent to functions.makeARGB """ - if getConfigOption('imageAxisOrder') == 'row-major': - img = img.transpose((1, 0, 2)) + if getConfigOption('imageAxisOrder') == 'col-major': + img = img.swapaxes(0, 1) self.opts = (img, args, kargs) self.image = None self.update() @@ -56,7 +56,7 @@ class RawImageWidget(QtGui.QWidget): argb, alpha = fn.makeARGB(self.opts[0], *self.opts[1], **self.opts[2]) if self._cp and self._cp.get_array_module(argb) == self._cp: argb = argb.get() # transfer GPU data back to the CPU - self.image = fn.makeQImage(argb, alpha) + self.image = fn.makeQImage(argb, alpha, copy=False, transpose=False) self.opts = () # if self.pixmap is None: # self.pixmap = QtGui.QPixmap.fromImage(self.image) @@ -78,7 +78,7 @@ class RawImageWidget(QtGui.QWidget): if HAVE_OPENGL: - class RawImageGLWidget(QtWidgets.QOpenGLWidget): + class RawImageGLWidget(QOpenGLWidget): """ Similar to RawImageWidget, but uses a GL widget to do all drawing. Performance varies between platforms; see examples/VideoSpeedTest for benchmarking. @@ -87,7 +87,7 @@ if HAVE_OPENGL: """ def __init__(self, parent=None, scaled=False): - QtWidgets.QOpenGLWidget.__init__(self, parent) + QOpenGLWidget.__init__(self, parent) self.scaled = scaled self.image = None self.uploaded = False From 0dc17ef54647b104bafb0c2480362028d1f6fbda Mon Sep 17 00:00:00 2001 From: KIU Shueng Chuan Date: Sat, 20 Feb 2021 18:58:26 +0800 Subject: [PATCH 2/2] RawImageGLWidget follow same style as RawImageWidget i.e. row-major convention is used internally and user inputs are converted at the point of entry. --- pyqtgraph/widgets/RawImageWidget.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pyqtgraph/widgets/RawImageWidget.py b/pyqtgraph/widgets/RawImageWidget.py index fb1a1e33..996f757d 100644 --- a/pyqtgraph/widgets/RawImageWidget.py +++ b/pyqtgraph/widgets/RawImageWidget.py @@ -99,6 +99,8 @@ if HAVE_OPENGL: img must be ndarray of shape (x,y), (x,y,3), or (x,y,4). Extra arguments are sent to functions.makeARGB """ + if getConfigOption('imageAxisOrder') == 'col-major': + img = img.swapaxes(0, 1) self.opts = (img, args, kargs) self.image = None self.uploaded = False @@ -119,10 +121,6 @@ if HAVE_OPENGL: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER) # glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER) - if getConfigOption('imageAxisOrder') == 'row-major': - image = self.image - else: - image = self.image.transpose((1, 0, 2)) ## Test texture dimensions first # shape = self.image.shape @@ -130,7 +128,8 @@ if HAVE_OPENGL: # if glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH) == 0: # raise Exception("OpenGL failed to create 2D texture (%dx%d); too large for this hardware." % shape[:2]) - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.shape[1], image.shape[0], 0, GL_RGBA, GL_UNSIGNED_BYTE, image) + h, w = self.image.shape[:2] + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, self.image) glDisable(GL_TEXTURE_2D) self.uploaded = True