声子&x27;的VideoWidget在QGLWidget(Qt、Python)上显示错误的颜色
我有一个宠物项目,其中包含一个视频播放器,具有显示字幕的功能。 到目前为止,我一直在研究项目的其他部分,但现在我必须以最好的方式实现字幕渲染部分 我没有发现任何有用的东西,除了 但是当我使用这个代码时,我得到了一个错误的视频图片。 修改颜色:红色→ 蓝色,蓝色→ 红色等等 有人能帮我写这段代码吗,或者给我演示另一种在视频上渲染字幕的解决方案 PS:我用PySide1.0.0、1.0.6以及Arch和UbuntuLinux对它进行了测试声子&x27;的VideoWidget在QGLWidget(Qt、Python)上显示错误的颜色,python,qt,opengl,video,pyside,Python,Qt,Opengl,Video,Pyside,我有一个宠物项目,其中包含一个视频播放器,具有显示字幕的功能。 到目前为止,我一直在研究项目的其他部分,但现在我必须以最好的方式实现字幕渲染部分 我没有发现任何有用的东西,除了 但是当我使用这个代码时,我得到了一个错误的视频图片。 修改颜色:红色→ 蓝色,蓝色→ 红色等等 有人能帮我写这段代码吗,或者给我演示另一种在视频上渲染字幕的解决方案 PS:我用PySide1.0.0、1.0.6以及Arch和UbuntuLinux对它进行了测试 编辑:变通方法 一个丑陋的黑客是可用的,多亏了。它更改p
编辑:变通方法 一个丑陋的黑客是可用的,多亏了。它更改
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_())
有些操作系统、框架、文件格式等将颜色存储为RGB,有些存储为BGR(后者在Windows中更常见)。因此,如果将颜色从其中一个传递到另一个,则红色/蓝色交换很常见。仔细查看您的颜色结构,确保您使用的技术是正确的。正如在评论中指出的,这是Qt的一个已知缺陷
有人甚至在这里添加了解决方法。有一个关于该问题的错误报告:请接受“这是一个错误,请参阅链接”的回答。这在未回答的问题中不断出现。