PyQt5 Python 3.5.0: конвертировать файл DDS в QImage
Некоторое время я боролся с этим и чувствую, что исчерпал все свои возможности, поэтому надеюсь, что кто-нибудь сможет мне в этом помочь;
Я пытаюсь загрузить кучу файлов DDS, преобразовать их в объекты QImage и отобразить их в QGraphicsView. До сих пор я делал успехи, но теперь я врезался в стену, которую я не могу пройти. До сих пор я обращался к этим ресурсам, но безуспешно в решении моей проблемы:
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