Skip to content

为什么在 SOUI 中加载 JPG 文件失败?

Warning

The current page still doesn't have a translation for this language.

You can read it through google translate.

在 SOUI 中,图像解码器是一个独立的模块。不同的解码器决定了程序中能够加载的图片类型。

默认解码器限制

使用 SComMgr 来加载 SOUI 的模块时,debug 模式下默认的图片解码器是 imgdecoder-stb。这个解码器只能解码 PNG 图片。

之所以选择这个解码器作为 debug 版本的默认解码器,是为了演示在 SOUI 中使用 APNG 动画,只有这个解码器支持 APNG 解码。

支持的解码器类型

SOUI 实现了 3 种图片解码器:

解码器 支持格式 特点
imgdecoder-stb JPG, PNG, BMP, TGA , APNG 等 轻量级第三方库
imgdecoder-wic JPG, PNG, BMP, GIF 等 使用 Windows 图像组件
imgdecoder-gdip JPG, PNG, BMP, GIF 等 使用 GDI+

解决方案

要使用其他解码器,只需要在实例化 SComMgr 时提供一个解码器参数:

class SComMgr
{
public:
    SComMgr(LPCTSTR pszImgDecoder = NULL)
    {
        if(pszImgDecoder) 
            m_strImgDecoder = pszImgDecoder;
        else 
            m_strImgDecoder = COM_IMGDECODER;
    }

    BOOL CreateImgDecoder(IObjRef ** ppObj)
    {
        if(m_strImgDecoder == _T("imgdecoder-wic"))
            return SOUI::IMGDECODOR_WIC::SCreateInstance(ppObj);
        else if(m_strImgDecoder == _T("imgdecoder-stb"))
            return SOUI::IMGDECODOR_STB::SCreateInstance(ppObj);
        else if(m_strImgDecoder == _T("imgdecoder-gdip"))
            return SOUI::IMGDECODOR_GDIP::SCreateInstance(ppObj);
        else
        {
            SASSERT(0);
            return FALSE;
        }
    }
    //...
}

实际应用

要实现 JPG 的解码,可以使用以下方式:

方法一:指定解码器类型

// 使用 GDI+ 解码器支持 JPG
SComMgr *pComMgr = new SComMgr(_T("imgdecoder-gdip"));

// 或使用 WIC 解码器
SComMgr *pComMgr = new SComMgr(_T("imgdecoder-wic"));

// 或使用 STB 解码器
SComMgr *pComMgr = new SComMgr(_T("imgdecoder-stb"));

方法二:修改默认配置

在项目配置中修改默认解码器:

// 在初始化时设置默认解码器
#define COM_IMGDECODER _T("imgdecoder-gdip")
#include "souistd.h"

方法三:运行时动态切换

// 根据需要动态创建不同解码器
void SwitchImageDecoder(LPCTSTR lpszDecoder)
{
    SComMgr *pComMgr = new SComMgr(lpszDecoder);
    // 使用解码器...
}

推荐做法

对于需要支持多种图片格式的应用程序,推荐使用以下配置:

  1. 开发阶段:使用 imgdecoder-stb 以便测试 APNG 动画功能
  2. 生产环境:使用 imgdecoder-wicimgdecoder-gdip 以获得最佳兼容性

注意事项

  1. 确保对应的解码器 DLL 文件存在于程序目录中
  2. 检查解码器模块是否正确初始化
  3. 不同解码器对相同格式的支持可能略有差异
  4. 某些解码器可能对特定格式有额外的性能优化