From 99d8a727056898f496383e04144d387ced7b42ca Mon Sep 17 00:00:00 2001 From: zhangyuanyuan1 Date: Tue, 2 Jun 2026 14:41:44 +0800 Subject: [PATCH] =?UTF-8?q?fix(DesktopBackground):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=8A=A0=E8=BD=BDdib=E6=A0=BC=E5=BC=8F=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98(589299)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 引入QImageReader,指定加载格式“BMP” Bug: #589299 From: kylin Severity: Moderate Changelog-Bug: #589299 【多任务视图】使用dib格式图片当背景,多任务视图黑屏 --- windowsview/desktopbackground.cpp | 41 +++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/windowsview/desktopbackground.cpp b/windowsview/desktopbackground.cpp index eaed99b02..10ce09cf7 100644 --- a/windowsview/desktopbackground.cpp +++ b/windowsview/desktopbackground.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include @@ -49,6 +50,34 @@ QImage DesktopBackground::m_nonBlurBackground; quint32 DesktopBackground::m_blurRadius = 0; static int backgroundNum = 0; +/*! + * \brief 加载图片,支持 DIB 格式 + * \param filePath 图片文件路径 + * \return 加载成功返回图片,失败返回空图片 + */ +static QImage loadImageWithImageReader(const QString &filePath) +{ + // 先尝试直接加载(支持大多数常见格式) + QImage image(filePath); + if (!image.isNull()) { + return image; + } + + // 如果直接加载失败,尝试使用 QImageReader 加载 BMP 格式 + // Qt 默认不支持直接加载纯 DIB 格式的文件‌,或者文件头信息不符合标准 BMP 规范,尝试指定格式 + QImageReader readerBmp(filePath, "BMP"); + if (readerBmp.canRead()) { + image = readerBmp.read(); + if (!image.isNull()) { + return image; + } else { + qDebug() << "Failed to read image:" << filePath << readerBmp.format() << readerBmp.errorString(); + } + } + + return QImage(); +} + DesktopBackground::DesktopBackground(QQuickPaintedItem *parent) : QQuickPaintedItem(parent) , m_blurAlpha(0) @@ -104,7 +133,15 @@ void DesktopBackground::init() m_scalingFactor = getSystemScalingFactor(); if (m_nonBlurBackground.isNull()) { - QImage image(m_backgroundFile); + QImage image = loadImageWithImageReader(m_backgroundFile); + if (image.isNull()) { + // 异常处理:加载背景图失败,则显示纯色背景 + m_usePureColor = true; + return; + } else { + m_usePureColor = false; + } + m_nonBlurBackground = image; if (m_backgroundFillStyle == "centered" || m_backgroundFillStyle == "wallpaper") { // 居中 或 平铺 @@ -585,7 +622,7 @@ BackgroundImageHandler::BackgroundImageHandler(ImageTask taskFunc, QObject *cont QImage BackgroundImageHandler::loadBackgroundImage(const QString& filePath, double scalingFactor, const QString& fillStyle) { - QImage image(filePath); + QImage image = loadImageWithImageReader(filePath); if (scalingFactor != 1.0) { if (fillStyle == "centered" || fillStyle == "wallpaper") { // 居中 或 平铺 -- Gitee