首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QT中的像素化gif

问QT中的像素化gif
EN

Stack Overflow用户
提问于 2021-04-26 05:10:05
回答 2查看 302关注 0票数 0

我试图在QT应用程序中显示一个gif文件,使用链接中提供的方法:https://code.qt.io/cgit/qt/qtbase.git/tree/examples/widgets/widgets/movie?h=5.15

方法使用QMovie对象集在QLabel中。

这个例子很好用。

但是,如果我为应用程序启用高新闻部缩放功能,gif就会变成全部像素化。请看下面的截图。

这是我添加的行,以支持高新闻部缩放。

代码语言:javascript
复制
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

​

​

有什么办法解决这个问题吗?

我已经尝试了以下修复方法:

  • 用于setScaledSize对象的QMovie
  • setScaledContents(true)用于QLabel

我使用的QT版本是5.15.2,平台是Windows。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-26 05:27:43

现在看来,在使用QMovie和QLabel进行缩放时,没有办法呈现锐利的gifs。我已经在QT错误跟踪器中为同样的错误提交了一个bug。

与此同时,我找到了一个行之有效的解决办法。它是利用QWidget系统中的QML,使用QQuickWidget来完成的。

让我在这里添加完整的步骤,以便对遇到此问题的其他任何人都有帮助:

首先,我们需要添加对Qml和QuickWidgets的支持。我使用CMake和。因此,我在CMakeLists.txt文件中添加了以下行。如果使用QT,则需要在.pro文件中进行等效的更改。

代码语言:javascript
复制
# I'm only adding the relevant lines for brevity
find_package(Qt5 COMPONENTS Qml QuickWidgets)

target_link_libraries(${APP_TARGET_NAME}
    Qt5::Qml
    Qt5::QuickWidgets)

# Note the --qmldir switch
add_custom_command (TARGET ${APP_TARGET_NAME} POST_BUILD
    COMMAND ${QTDIR}/bin/windeployqt
        --qmldir ${CMAKE_CURRENT_SOURCE_DIR}/qml
        ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/${APP_TARGET_NAME}.exe)

然后在名为spinner.qml的文件夹中创建一个qml文件

代码语言:javascript
复制
import QtQuick 2.15

Rectangle {
    width: 12
    height: 12
    AnimatedImage {
        y: 5
        width: 12
        height: 12
        id: spinner
        source: "img/spinner.gif"
        speed: 1.0
    }
}

然后使用QQuickWidget加载qml文件,并将QQuickWidget实例添加到QWidget布局中。

代码语言:javascript
复制
QHBoxLayout *main_layout = new QHBoxLayout();
auto *spinner_gif = new QQuickWidget(QUrl::fromLocalFile(":/spinner.qml"));
main_layout->addWidget(spinner_gif);
this->setLayout(main_layout);

显示的gif即使在缩放时也不会被像素化,我们可以在任务管理器中看到正在使用的GPU,就像QQuickWidget所期望的那样。

票数 0
EN

Stack Overflow用户

发布于 2021-04-26 11:28:35

一张GIF图片的颜色不能超过256种。当您将这样的图像加载到Qt中时,它在内部用GIF表示的调色板( 256种颜色)表示,即使您的硬件可以显示更多的颜色。

这也意味着当你缩放这样的图像时,Qt不允许扩大色彩空间来渲染中间的颜色这意味着缩放的GIF图片通常看起来比缩放的高彩色图像糟糕得多。

解决这一问题的方法要么是将您从GIF图片创建的QImage转换为具有更大颜色空间的格式,然后再缩放它(使用QImage::convertToFormat),或者更好的是,根本不使用GIF图像。毕竟,GIF是30年前开发的一种格式,从来没有经过真正的更新以适应现代硬件,使用它时,您会人为地将程序限制在这种格式的功能上。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67261133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档