QT中的像素化gif

QT中的像素化gif,qt,Qt,我正在尝试使用链接中提供的方法在QT应用程序中显示gif文件: 该方法使用QLabel中的QMovie对象集 这个例子效果很好 但如果我为应用程序启用高DPI缩放,gif将变得完全像素化。请参见下面的屏幕截图 这是我为实现高DPI扩展而添加的行 QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); 有没有办法把这个修好 我已经尝试了以下修复: setScaledSize用于QMovie对象 setScaledContents(t

我正在尝试使用链接中提供的方法在QT应用程序中显示gif文件:

该方法使用QLabel中的QMovie对象集

这个例子效果很好

但如果我为应用程序启用高DPI缩放,gif将变得完全像素化。请参见下面的屏幕截图

这是我为实现高DPI扩展而添加的行

QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

有没有办法把这个修好

我已经尝试了以下修复:

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

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

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

这也意味着,当您缩放这样一幅图像时,Qt不允许扩展颜色空间以在颜色之间渲染-这意味着缩放后的GIF图片通常必须比缩放后的高颜色图像看起来更糟糕


解决这个问题的方法是,在缩放GIF图片之前,将您从GIF图片创建的QImage转换为具有更大颜色空间的格式(使用QImage::CONVERTOFORMAT),或者更好的是,根本不使用GIF图像。毕竟,GIF是30年前开发的一种格式,从未真正进行过更新以适应现代硬件,使用它,您人为地将程序限制在该格式的能力范围内。

目前看来,在使用QMovie和QLabel缩放时,无法呈现清晰的GIF。我已经在年提交了一个相同的bug

与此同时,我找到了一个很好的解决办法。在QWidget系统中使用QML,使用

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

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

# 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)
然后使用QQuickWidget加载qml文件,并将QQuickWidget实例添加到QWidget布局中

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所预期的那样。

您希望通过
Qt::AA_EnableHighDpiScaling
实现什么,或者更确切地说,您想用它解决什么问题?你可能需要接受,每当你重新缩放低分辨率位图时,你都会引入像素化。我需要应用程序按照屏幕分辨率/比例进行缩放。我可以使用2倍图像的QPixMap
scaled
方法对图像执行此操作。但是,即使我使用2x gif文件,同样的方法也不适用于gif。因此,您的问题归结为“为什么gif的缩放比Qpixmap差那么多?”?答案是前者比后者差得多,从有限的256色调色板开始。在某种程度上是的,但两者都是不同的类别:
QPixmap
QMovie
进行比较。您建议如何在缩放时减少GIF的像素化?
QHBoxLayout *main_layout = new QHBoxLayout();
auto *spinner_gif = new QQuickWidget(QUrl::fromLocalFile(":/spinner.qml"));
main_layout->addWidget(spinner_gif);
this->setLayout(main_layout);