我现在已经挣扎了一段时间了,我觉得我已经筋疲力尽了所有的选择,所以我希望有人可以帮我这个;
我试图加载一堆DDS文件,将它们转换为QImage对象并在QGraphicsView中显示它们。到目前为止,我一直在取得进步,但现在我已经碰到了一条似乎无法通过的墙。到目前为止,我已经咨询了这些资源,没有运气解决我的问题:
QT forum post, this is where it really started
def readDDSFile(self, filePath, width, height):
glWidget = QGLWidget()
glWidget.makeCurrent()
glWidget.setGeometry(0,0,width,height) # init width and height, in an attempt to force the widget to be the same size as the texture
# works fine, DDS file loads without problem
texture = glWidget.bindTexture(filePath)
if not texture:
return QtGui.QImage()
# Determine the size of the DDS image
glBindTexture(GL_TEXTURE_2D, texture)
self._width = glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH)
self._height = glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT)
if self._width == 0 and self._height == 0:
return QtGui.QImage()
# up to here, everything works fine, DDS files are being loaded, and, in the line below, rendered. They're just being rendered way too small.
glWidget.drawTexture(QtCore.QRectF(-1,-1,2,2), texture)
return (glWidget.grabFrameBuffer())
和一堆旧的谷歌小组讨论基本上做同样的事情(这一切似乎从最后一个链接开始)
我目前使用PyQt5,Python版本3.5.0
问题在于: 在PyaQt5中,似乎不支持QGLPixelBuffer(我似乎无论如何都无法导入它,无论我尝试从哪个模块导入它,所以我认为它是这样的)因此我仅限于使用QGLWidget作为我的渲染平台。但是,上面的代码似乎没有正确调整我的纹理大小。无论我做什么,他们都会一直被渲染得太小。
我从techartists线程中获取了这些代码(大部分都是这样),不幸的是,由于drawTexture rect被设置为(-1,-1,2,2),所以从未给出解释,所以当我不知道真的很了解那里发生了什么,我认为这可能是问题所在。
如果有人对此有任何想法,我将非常感谢...
干杯
答案 0 :(得分:0)
我想我会发布我发现的答案,因为我花了一天半的时间来寻找这个,并且了解它是有用的;
我最终使用pyglet来解决这个问题,How do I get the name of an object's type in JavaScript?对大多数图像文件格式都有本机支持,并且可以很容易地返回像素数据数组,然后QImage类可以读取这些数据以创建QImage类。代码看起来有点像这样:
import pyglet
def readDDSFile(filePath):
_img = pyglet.image.load(filePath)
_format = tex.format
pitch = tex.width * len(_format)
pixels = tex.get_data(_format, pitch)
img = QtGui.QImage(pixels, tex.width, tex.height, QtGui.QImage.Format_RGB32)
img = img.rgbSwapped()
return img