2016-06-28 1 views
1

Cela fait un moment que je me bats avec cela et j'ai l'impression d'avoir épuisé toutes mes options, alors j'espère que quelqu'un pourra m'aider avec ça; J'essaie de charger un tas de fichiers DDS, de les convertir en objets QImage et de les afficher dans un QGraphicsView. Jusqu'à présent, j'ai fait des progrès mais maintenant j'ai frappé un mur que je n'arrive pas à dépasser. J'ai consulté ces ressources jusqu'à présent, sans succès pour résoudre mon problème:PyQt5 Python 3.5.0: convertir le fichier DDS en QImage

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()) 

et un tas de vieux Google Les discussions de groupe font essentiellement la même chose (tout semblait commencer par ça dernier lien)

Je suis actuellement sur PyQt5, Python version 3.5.0

Le problème est le suivant: dans PyaQt5, QGLPixelBuffer ne semble pas être pris en charge (je ne peux pas sembler importer de toute façon, quel que soit du module que j'essaie de l'importer, donc je présume qu'il l'est), donc je suis limité à l'utilisation de QGLWidget comme ma plate-forme de rendu. Cependant, le code ci-dessus ne semble pas dimensionner correctement mes textures. Ils sont constamment rendus trop petit, peu importe ce que je fais.

J'ai pris ce code du thread techartists (la plupart de toute façon), et malheureusement une explication n'est jamais donnée pour la raison pour laquelle drawTexture rect est mis à (-1, -1,2,2), donc pendant que je Je ne comprends pas vraiment ce qui se passe là-bas, je présume que c'est probablement là que se trouve le problème.

Si quelqu'un a des idées à ce sujet, je serais très très reconnaissants ...

Vive

Répondre

0

je pensais que je posterais la réponse que je trouve car j'ai passé une journée et demie pour la recherche ceci, et il est utile de le savoir; J'ai fini par résoudre cela en utilisant pyglet, qui supporte nativement la plupart des formats de fichiers image, et qui peut facilement retourner un tableau de données de pixels, que les classes QImage peuvent ensuite lire pour créer une classe QImage. le code ressemble un peu à ceci:

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