Merge pull request #503 from kiwi0fruit/patch-1

Fix bug in RawImageWidget.py
This commit is contained in:
Ogi Moore 2020-06-09 20:50:58 -07:00 committed by GitHub
commit 26d54e7cc0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,15 +1,24 @@
# -*- coding: utf-8 -*-
"""
RawImageWidget.py
Copyright 2010-2016 Luke Campagnola
Distributed under MIT/X11 license. See license.txt for more infomation.
"""
from ..Qt import QtCore, QtGui
try:
from ..Qt import QtOpenGL
from OpenGL.GL import *
HAVE_OPENGL = True
except Exception:
except (ImportError, AttributeError):
# Would prefer `except ImportError` here, but some versions of pyopengl generate
# AttributeError upon import
HAVE_OPENGL = False
from .. import functions as fn
import numpy as np
from .. import getConfigOption, functions as fn
class RawImageWidget(QtGui.QWidget):
"""
@ -17,12 +26,14 @@ class RawImageWidget(QtGui.QWidget):
Generally using an ImageItem inside GraphicsView is fast enough.
On some systems this may provide faster video. See the VideoSpeedTest example for benchmarking.
"""
def __init__(self, parent=None, scaled=False):
"""
Setting scaled=True will cause the entire image to be displayed within the boundaries of the widget. This also greatly reduces the speed at which it will draw frames.
Setting scaled=True will cause the entire image to be displayed within the boundaries of the widget.
This also greatly reduces the speed at which it will draw frames.
"""
QtGui.QWidget.__init__(self, parent=None)
self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding))
QtGui.QWidget.__init__(self, parent)
self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding))
self.scaled = scaled
self.opts = None
self.image = None
@ -43,22 +54,22 @@ class RawImageWidget(QtGui.QWidget):
argb, alpha = fn.makeARGB(self.opts[0], *self.opts[1], **self.opts[2])
self.image = fn.makeQImage(argb, alpha)
self.opts = ()
#if self.pixmap is None:
#self.pixmap = QtGui.QPixmap.fromImage(self.image)
# if self.pixmap is None:
# self.pixmap = QtGui.QPixmap.fromImage(self.image)
p = QtGui.QPainter(self)
if self.scaled:
rect = self.rect()
ar = rect.width() / float(rect.height())
imar = self.image.width() / float(self.image.height())
if ar > imar:
rect.setWidth(int(rect.width() * imar/ar))
rect.setWidth(int(rect.width() * imar / ar))
else:
rect.setHeight(int(rect.height() * ar/imar))
rect.setHeight(int(rect.height() * ar / imar))
p.drawImage(rect, self.image)
else:
p.drawImage(QtCore.QPointF(), self.image)
#p.drawPixmap(self.rect(), self.pixmap)
# p.drawPixmap(self.rect(), self.pixmap)
p.end()
@ -67,14 +78,18 @@ if HAVE_OPENGL:
"""
Similar to RawImageWidget, but uses a GL widget to do all drawing.
Perfomance varies between platforms; see examples/VideoSpeedTest for benchmarking.
Checks if setConfigOptions(imageAxisOrder='row-major') was set.
"""
def __init__(self, parent=None, scaled=False):
QtOpenGL.QGLWidget.__init__(self, parent=None)
QtOpenGL.QGLWidget.__init__(self, parent)
self.scaled = scaled
self.image = None
self.uploaded = False
self.smooth = False
self.opts = None
self.row_major = getConfigOption('imageAxisOrder') == 'row-major'
def setImage(self, img, *args, **kargs):
"""
@ -100,15 +115,20 @@ if HAVE_OPENGL:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
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)
shape = self.image.shape
# glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER)
### Test texture dimensions first
#glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGBA, shape[0], shape[1], 0, GL_RGBA, GL_UNSIGNED_BYTE, None)
#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])
if self.row_major:
image = self.image
else:
image = self.image.transpose((1, 0, 2))
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, shape[0], shape[1], 0, GL_RGBA, GL_UNSIGNED_BYTE, self.image.transpose((1,0,2)))
# ## Test texture dimensions first
# shape = self.image.shape
# glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGBA, shape[0], shape[1], 0, GL_RGBA, GL_UNSIGNED_BYTE, None)
# 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)
glDisable(GL_TEXTURE_2D)
def paintGL(self):
@ -125,19 +145,16 @@ if HAVE_OPENGL:
glViewport(0, 0, self.width() * self.devicePixelRatio(), self.height() * self.devicePixelRatio())
glEnable(GL_TEXTURE_2D)
glBindTexture(GL_TEXTURE_2D, self.texture)
glColor4f(1,1,1,1)
glColor4f(1, 1, 1, 1)
glBegin(GL_QUADS)
glTexCoord2f(0,0)
glVertex3f(-1,-1,0)
glTexCoord2f(1,0)
glTexCoord2f(0, 1)
glVertex3f(-1, -1, 0)
glTexCoord2f(1, 1)
glVertex3f(1, -1, 0)
glTexCoord2f(1,1)
glTexCoord2f(1, 0)
glVertex3f(1, 1, 0)
glTexCoord2f(0,1)
glTexCoord2f(0, 0)
glVertex3f(-1, 1, 0)
glEnd()
glDisable(GL_TEXTURE_3D)