PyQt5 Python 3.5.0:将DDS文件转换为QImage

时间:2016-06-28 17:54:42

标签: python opengl pyqt5 dds-format

我现在已经挣扎了一段时间了,我觉得我已经筋疲力尽了所有的选择,所以我希望有人可以帮我这个;

我试图加载一堆DDS文件,将它们转换为QImage对象并在QGraphicsView中显示它们。到目前为止,我一直在取得进步,但现在我已经碰到了一条似乎无法通过的墙。到目前为止,我已经咨询了这些资源,没有运气解决我的问题:

tech-artists post

github pos

pyqt4 reference

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),所以从未给出解释,所以当我不知道真的很了解那里发生了什么,我认为这可能是问题所在。

如果有人对此有任何想法,我将非常感谢...

干杯

1 个答案:

答案 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