如何镜像电影并反向播放?

时间:2016-07-12 04:55:08

标签: qt pyqt pyside

我一直在玩QMovie尝试镜像电影以及反向播放。 对于镜像位,我尝试指定负宽度无济于事。由于QImage确实为此提供了设施,我希望QMovie也可以这样做。 对于那些事情,QMovie对象中似乎没有任何设施,所以我想知道我是否可以操纵QIODeviceQMovie对象而不是实现此目的,但是这对我来说是一个全新的领域,我没有在文档中看到任何可以实现镜像或反向播放的内容。 开始的代码示例与PySide页面上的代码示例相同:

label = QLabel()
movie = QMovie("animations/fire.gif")
label.setMovie(movie)
movie.start()

非常感谢任何想法。

谢谢, 弗兰克

1 个答案:

答案 0 :(得分:2)

QMovie没有提供设置当前图片的方法,因此您必须直接使用QImageReader反向播放(使用QImageReader::jumpToImage())。这不是很容易,因为一帧和下一帧之间的延迟可能会发生变化,但是你可以调用它QImageReader::nextImageDelay()

要显示影片,您可以实现自己的小部件以根据需要绘制影片。

paintEvent()中,您可以设置转换为画家以获得镜像效果,然后绘制电影的当前图像。

示例:

void MyWidget::paintEvent(QPaintEvent * event)
{
    QPainter painter(this);
    painter.scale(-1, 1); // x-axis mirror
    //here maybe you must adjust the transformation to center and scale the movie.
    painter.drawImage(0, 0, currentImage);
}

要播放电影,您必须设置一个更改当前图像的计时器。

示例:

//you must create a timer in the constructor and connect it to this slot
void MyWidget::timeoutSlot()
{
    int currentImageIndex;
    //here you have to compute the image index
    imageReader.jumpToImage(currentImageIndex);
    currentImage = imageReader.read(); //maybe you want to read it only if the index is changed
    update();
}

Here你可以找到一个小部件子类的例子,带有计时器和画家转换

另请参阅QImageReaderQTimerQWidget::paintEvent