为什么在 SOUI 中加载 JPG 文件失败?¶
在 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);
// 使用解码器...
}
推荐做法¶
对于需要支持多种图片格式的应用程序,推荐使用以下配置:
- 开发阶段:使用
imgdecoder-stb
以便测试 APNG 动画功能 - 生产环境:使用
imgdecoder-wic
或imgdecoder-gdip
以获得最佳兼容性
注意事项¶
- 确保对应的解码器 DLL 文件存在于程序目录中
- 检查解码器模块是否正确初始化
- 不同解码器对相同格式的支持可能略有差异
- 某些解码器可能对特定格式有额外的性能优化