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