VideoWidget от Phonon показывает неправильные цвета на QGLWidget (Qt, Python) - PullRequest
18 голосов
/ 07 октября 2011

У меня есть домашний проект, который содержит видеоплеер с функцией отображения субтитров.До сих пор я работал над другими частями своего проекта, но теперь я должен наилучшим образом реализовать часть рендеринга субтитров.

Я не нашел ничего полезного в этом отношении, кроме это .

Но когда я использую этот код, я получаю неправильное изображение видео.video frame with red and blue swapped

Изменены цвета: красный → синий, синий → красный и т. Д.

Может кто-нибудь помочь мне с этим кодом или показать другое решение для рендеринга субтитров поверх видео??

PS: я тестировал его с PySide 1.0.0, 1.0.6 и на Arch и Ubuntu linux.


Редактировать: Обходной путь

Уродливый хакдоступно, благодаря alexisdm .Изменяет метод paint() для инвертирования цветов.

import sys
from PySide.QtGui import QApplication, QMessageBox
# overlay
from PySide.QtGui import QGraphicsScene, QGraphicsView, QGraphicsProxyWidget, QPainter, QImage
from PySide.QtOpenGL import QGLWidget

from PySide.phonon import Phonon

try:
    from OpenGL import GL
except ImportError:
    app = QApplication(sys.argv)
    QMessageBox.critical(None, "OpenGL 2dpainting",
                            "PyOpenGL must be installed to run this example.",
                            QMessageBox.Ok | QMessageBox.Default,
                            QMessageBox.NoButton)
    sys.exit(1)


#class CustomProxy(QGraphicsProxyWidget):
#    def __init__(self, parent=None):
#        QGraphicsProxyWidget.__init__(self, parent)
#
#
#    def boundingRect(self):
#        return QGraphicsProxyWidget.boundingRect(self).adjusted(0, 0, 0, 0);


class CustomProxy(QGraphicsProxyWidget):
    def __init__(self, parent=None):
        QGraphicsProxyWidget.__init__(self, parent)


    def boundingRect(self):
        return QGraphicsProxyWidget.boundingRect(self).adjusted(0, 0, 0, 0);

# This is the magic:
    def paint(self, painter, option, widget=None):
        painter_inverted = QPainter()
        brect= QGraphicsProxyWidget.boundingRect(self)
        invertedColor = QImage(brect.width(),brect.height(),QImage.Format_RGB32)
        painter_inverted.begin(invertedColor)
        QGraphicsProxyWidget.paint(self,painter_inverted, option, widget)
        painter_inverted.end()
        painter.drawImage(0,0,invertedColor.rgbSwapped())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setApplicationName("tete")

    scene = QGraphicsScene()

    media = Phonon.MediaObject()
    video = Phonon.VideoWidget()
    Phonon.createPath(media, video)

    proxy = CustomProxy()
    proxy.setWidget(video)
    rect = proxy.boundingRect()
    #proxy.setPos(0, 0)
    #proxy.show()
    scene.addItem(proxy)

    media.setCurrentSource("/home/boo/Development/mindmap/test/resources/glvideo.avi")
    media.play()

    titem = scene.addText("Bla-bla-bla")
    titem.setPos(130, 130)
    #titem.setPos(rect.width()/2, rect.height()/2)

    view = QGraphicsView(scene)
    vp = QGLWidget()
    view.setViewport(vp)

    #view.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform)
    view.setViewportUpdateMode(QGraphicsView.BoundingRectViewportUpdate)
    view.setWindowTitle("Eternal fire")

    view.show()
    sys.exit(app.exec_())

Ответы [ 2 ]

2 голосов
/ 01 марта 2013

Как указывает alexisdm в комментарии, это известная ошибка Qt.

. Она может быть найдена как # GTBUG-8738 , где кто-то даже добавилОбходной путь.

0 голосов
/ 17 февраля 2013

Некоторые ОС, фреймворки, форматы файлов и т. Д. Хранят цвет как RGB, некоторые как BGR (последний чаще встречается в Windows).Таким образом, красный / синий обмен часто встречается, если вы передаете цвета от одного из них к другому.Внимательно посмотрите на свои цветовые структуры, чтобы убедиться, что вы используете правильные структуры для используемых вами технологий.

...