diff --git a/windowsview/desktopbackground.cpp b/windowsview/desktopbackground.cpp index eaed99b02715dde5923ac5579393bcc5276adb34..10ce09cf79adb4dd27a94c414a0a061f9ab4d5cb 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") { // 居中 或 平铺