PyQt5 Python 3.5.0: конвертировать файл DDS в QImage

Некоторое время я боролся с этим и чувствую, что исчерпал все свои возможности, поэтому надеюсь, что кто-нибудь сможет мне в этом помочь;

Я пытаюсь загрузить кучу файлов DDS, преобразовать их в объекты QImage и отобразить их в QGraphicsView. До сих пор я делал успехи, но теперь я врезался в стену, которую я не могу пройти. До сих пор я обращался к этим ресурсам, но безуспешно в решении моей проблемы:

пост технических художников

GitHub Pos

PyQT4 ссылка

QT сообщение на форуме, это то, где это действительно началось

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

и куча старых обсуждений групп Google в основном делали то же самое (казалось, все начиналось с этой последней ссылки)

Я в настоящее время на PyQt5, Python версии 3.5.0

Проблема заключается в следующем: в PyaQt5 QGLPixelBuffer, похоже, не поддерживается (я все равно не могу импортировать его, независимо от модуля, из которого я пытаюсь его импортировать, поэтому я предполагаю, что это так), поэтому я ограничен использованием QGLWidget в качестве моей платформы рендеринга. Тем не менее, приведенный выше код, похоже, неправильно определяет размеры моих текстур. Они постоянно оказываются слишком маленькими, независимо от того, что я делаю.

Я взял этот код из потока techartists (по большей части так или иначе), и, к сожалению, объяснение никогда не приводится по той причине, что для прямоугольника drawTexture установлено значение (-1,-1,2,2), поэтому пока я не очень Понимаю, что там происходит, полагаю, именно в этом и заключается проблема.

Если у кого-то есть идеи по этому поводу, я был бы очень признателен...

ура

1 ответ

Решение

Я думал, что выложу ответ, который нашел, увидев, как потратил полтора дня на поиски этого, и полезно знать об этом;

В итоге я решил эту проблему, используя pyglet, который имеет встроенную поддержку большинства форматов файлов изображений и может довольно легко вернуть массив данных пикселей, который классы 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
Другие вопросы по тегам