- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 QMovie 在 QLabal 上播放 webp 动画,代码如下:
Foo::Foo() {
movie_ = new QMovie("/path/to/my.webp", "", this);
ui->label->setMovie(movie_);
}
void Foo::on_pushButton_clicked() {
movie_->stop();
movie_->start();
}
但是当我播放动画时,帧断断续续,例如:
我尝试使用 QImage::save 提取 webp 帧,代码如下:
QImageReader *reader = new QImageReader("/path/to/my.webp");
reader->setDecideFormatFromContent(true);
for (int i = 0; i < reader->imageCount(); ++i) {
QImage image;
reader->read(&image);
image.save(QString("frame_%1.png").arg(i));
reader->jumpToNextImage();
}
所有提取的帧也都是断断续续的,比如:
但是当我使用google libwebp工具提取帧时,没有任何问题。比如:
// extract frame 9, not problem
webpmux.exe -get frame 9 -o "frame_9.webp"
// paly webp animation, there is no any problem
vwebp.exe /path/to/my.webp
是Qt的问题吗? Qt 5.9.4(我正在使用)和 Qt 最新版本(我正在尝试)都有这个问题。
最佳答案
这似乎是一个 Qt 错误,该错误已在 Qt 版本 5.9.1 上报告: WebP: animations don't respect alpha
Qt说这个bug在5.9.2版本已经解决了,但是即使是Qt 5.11问题依然存在。
有官方solution :
diff --git a/src/plugins/imageformats/webp/qwebphandler.cpp b/src/plugins/imageformats/webp/qwebphandler.cpp
index 5a0ae4a..ce90158 100644
--- a/src/plugins/imageformats/webp/qwebphandler.cpp
+++ b/src/plugins/imageformats/webp/qwebphandler.cpp
@@ -122,6 +122,8 @@ bool QWebpHandler::ensureScanned() const
that->m_bgColor = QColor::fromRgba(QRgb(WebPDemuxGetI(m_demuxer, WEBP_FF_BACKGROUND_COLOR)));
that->m_composited = new QImage(that->m_features.width, that->m_features.height, QImage::Format_ARGB32);
+ if (that->m_features.has_alpha)
+ that->m_composited->fill(Qt::transparent);
// We do not reset device position since we have read in all data
m_scanState = ScanSuccess;
@@ -193,6 +195,8 @@ bool QWebpHandler::read(QImage *image)
} else {
// Animation
QPainter painter(m_composited);
+ if (m_features.has_alpha && m_iter.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND)
+ m_composited->fill(Qt::transparent);
painter.drawImage(currentImageRect(), frame);
*image = *m_composited;
这是我的解决方案:
1.添加一些代码
// ${QT_SRC}/qtimageformats/src/plugins/imageformats/webp/qwebphandler.cpp
// function QWebpHandler::read
if (m_features.has_alpha && (m_iter.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND ||
m_iter.blend_method == WEBP_MUX_NO_BLEND)) {
m_composited->fill(Qt::transparent);
}
2。重建qt webp插件
nmake module-qtimageformats
mv ${QT_DIR}/plugins/imageformats/qwebpd.dll ${QT_DIR}/plugins/imageformats/qwebpd.dll.bak
cp ${REBUILD_WEBP_PLUGINS} ${QT_DIR}/plugins/imageformats/qwebpd.dll
关于c++ - QMovie webp帧断断续续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53474445/
如何在 PyQt5 中使用 QMovie 应用边框半径或以其他方式实现圆角效果?它似乎对QSS没有反应。虽然我不认为它是相关的,但无论如何,这是我当前的代码,以给出我尝试过的内容: image = Q
我正在使用 QMovie 在 QLabal 上播放 webp 动画,代码如下: Foo::Foo() { movie_ = new QMovie("/path/to/my.webp", "",
开发者小伙伴们!我有一个关于 Qt 和多线程的问题。 === 简短版 ============================================ Qt可以做我想做的事吗?即(1)显示装载
嗨,我认为 QMovie 可以采用 QBuffer 吗?这是我的代码。 a = QByteArray(img) b = QBuffer(a) self.movie = QMovie(b, 'GIF')
我正在尝试使用 QLabel 播放 gif 动画。gif 动画用于显示加载状态。每次用户进入场景时都应播放动画。 随着进入次数的增加,标签越来越大。我不知道为什么。 这是简化的代码。 .h 文件: #
我需要在 QtDesigner 中加载 QMovie。我注意到很多类无法从 QtDesigner 访问。我通常在 QtDesigner 中进行设计,然后直接在代码中加载 ui 文件。这样我就不用担心用
我有一个简单的初始屏幕扩展,它应该在用户等待主窗口时显示一点动画(动画 gif)。问题是,只显示第一帧而不是全部: class SplashScreen : public QSplashScreen
我创建了一个 QLabel 并将它的电影设置为带有动画 gif 的 QMovie 对象。然后在我的应用程序的 resizeEvent 中调整大小并移动标签,使其居中/适合布局。这工作正常,但电影有很多
我如何在 PyQt5 中重新加载新的动画 gif 文件? 我想做的事: 加载 test.gif 播放 test.gif 用另一个任意动画 gif 覆盖原始 test.gif 文件 单击按钮时让 Qmo
我正在尝试将 gif 合并到我的项目中,但是源文件的分辨率很小,加载时会变得模糊。 过去,当我在 QLabels 中使用小图片时,它们在缩放时变得模糊,因为 Qt 试图在缩放时自动“平滑”它们。在那些
我可以用这样的代码旋转QPixmap QPixmap pix("img.jpg"); QMatrix rm; rm.rotate(90); pix = pix.transformed(
我正在为智力竞赛节目创建记分牌,我偶然发现了这个问题。下面的代码显示动画 .gif 的动画速度取决于玩家的当前分数。 void Scoreboard::label1(int i) {
我在 Windows 上部署显示动画 gif 的应用程序时遇到问题。为此,我使用 QMovie,如果我从 QtCreator 启动它,它工作正常。我收集了运行该应用程序所需的文件,我可以很好地启动它,
我想在currentFrameNumber等于frameCount时使用frameChanged(int)发出信号,我的QT版本是4.7.4 QObject::connect(movie,SIGNAL
我是 Ubuntu 和 Qt 的新手。我需要显示其他长时间操作的忙碌状态。所以,我只是尝试使用等待动画 gif 文件来加载,而不是使用进度条。 我正在为 Qt 项目使用 Eclipse 编辑器。 Tr
我已经为我的问题搜索了一些解决方案,但一无所获...我在一个 QLabel 中使用带有 GIF 动画的 QMovie 来获取加载状态,好吗?这很简单,我在这个链接中了解到:GIF animation
我看了很多问题,其中大部分不在这个网站上,他们都提到 QMovie 必须用文件名调用,就像这样 anim = QtGui.QMovie("Filename.gif") #or self.movie =
我正在尝试在 Qt 中使用 QMovie 来播放两个 GIF。当一个 gif 结束时,我需要播放下一个。 问题就出在这里。我想将信号连接到插槽,以便知道 GIF 动画何时结束。这是我的代码示例: #i
我是一名优秀的程序员,十分优秀!