[WM C++]从资源文件中加载显示png/jpg图片
2010-06-28 16:34
204 查看
前言
在Windows Mobile项目中大量的贴图确实能贴出非常精美的画面,但是默认支持的bmp格式的背景图片实在太大,800x400的图片大小居然居然达到1M,几个模块背景切换下来,再加上其他零散的小图片整个exe将近10M!看来必须让项目得支持png/jpg格式压缩过的图片。其实之前已经实现从文件加载png/jpg图片的办法,能实现但不理想,图片需要单独发布,且担心图片发布后被用户不小心删除。
文章
1. http://www.arstdesign.com/articles/picloader.html
2. http://www.cppblog.com/zhangyq/archive/2008/04/11/46816.aspx
3. IImage的图片显示
正文
一、 实现代码
void DrawImage(HDC hdc,RECT& rc,UINT nIDResource,CString lpType)
{
HINSTANCE hInst = AfxGetResourceHandle();
HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(nIDResource), lpType);
if (!hRsrc)
return;
//资源大小
DWORD len = SizeofResource(hInst, hRsrc);
//转换图片资源为字节数组
BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
if (!lpRsrc)
return;
IImagingFactory *pImgFactory = NULL;
IImage *pImage = NULL;
CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (SUCCEEDED(CoCreateInstance (CLSID_ImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IImagingFactory,
(void **)&pImgFactory)))
{
if (SUCCEEDED(pImgFactory->CreateImageFromBuffer(lpRsrc,len,BufferDisposalFlagNone,&pImage)))
{
pImage->Draw(hdc, &rc, NULL);
pImage->Release();
}
pImgFactory->Release();
}
CoUninitialize();
//释放资源
FreeResource(hRsrc);
}
代码说明:
a). 关键部分为将LoadResource转换成BYTE*以及CreateImageFromBuffer方法。
结束
研究过程中找了许多文章,大多数都是从文件加载。CxImage也试过了, 在CSDN上找到了据说是可以在WM运行的代码,但是关键方法都不能使用,唯一测试加载成功的是从Buffer加载,同上,但是这样一来代价太大,没有lib文件,还需要自己封装,裸的项目文件将近百个,编译都要老长时间。终于松口气,又完成一个任务 :)
在Windows Mobile项目中大量的贴图确实能贴出非常精美的画面,但是默认支持的bmp格式的背景图片实在太大,800x400的图片大小居然居然达到1M,几个模块背景切换下来,再加上其他零散的小图片整个exe将近10M!看来必须让项目得支持png/jpg格式压缩过的图片。其实之前已经实现从文件加载png/jpg图片的办法,能实现但不理想,图片需要单独发布,且担心图片发布后被用户不小心删除。
文章
1. http://www.arstdesign.com/articles/picloader.html
2. http://www.cppblog.com/zhangyq/archive/2008/04/11/46816.aspx
3. IImage的图片显示
正文
一、 实现代码
void DrawImage(HDC hdc,RECT& rc,UINT nIDResource,CString lpType)
{
HINSTANCE hInst = AfxGetResourceHandle();
HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(nIDResource), lpType);
if (!hRsrc)
return;
//资源大小
DWORD len = SizeofResource(hInst, hRsrc);
//转换图片资源为字节数组
BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
if (!lpRsrc)
return;
IImagingFactory *pImgFactory = NULL;
IImage *pImage = NULL;
CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (SUCCEEDED(CoCreateInstance (CLSID_ImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IImagingFactory,
(void **)&pImgFactory)))
{
if (SUCCEEDED(pImgFactory->CreateImageFromBuffer(lpRsrc,len,BufferDisposalFlagNone,&pImage)))
{
pImage->Draw(hdc, &rc, NULL);
pImage->Release();
}
pImgFactory->Release();
}
CoUninitialize();
//释放资源
FreeResource(hRsrc);
}
代码说明:
a). 关键部分为将LoadResource转换成BYTE*以及CreateImageFromBuffer方法。
结束
研究过程中找了许多文章,大多数都是从文件加载。CxImage也试过了, 在CSDN上找到了据说是可以在WM运行的代码,但是关键方法都不能使用,唯一测试加载成功的是从Buffer加载,同上,但是这样一来代价太大,没有lib文件,还需要自己封装,裸的项目文件将近百个,编译都要老长时间。终于松口气,又完成一个任务 :)
相关文章推荐
- [WM C++]从资源文件中加载显示png/jpg图片
- VC++图片控件(Picture Control)显示资源位图(BMP)、文件位图(BMP)、其它格式文件图片(JPG\PNG\BMP)的方法
- VC.NET从资源中加载图片(jpg,png)并显示
- Res目录下资源如图片文件和xml文件资源如何被加载显示出来
- 如何加载显示jpg ,png bmp等图片,利用CImage
- Res目录下资源如图片文件和xml文件资源如何被加载显示出来
- vc加载PNG以及JPG等图片资源并绘制图片
- 利用 GetModuleFileName获取exe文件路径,,以显示bmp, jpg, png图片
- 更新系统或者更换Eclipse后,双击Eclipse-drawable,或者在布局文件中,查看图片时,显示乱码。png 和 jpg
- Unity3d-WWW实现图片资源显示以及保存和本地加载
- 从资源中加载jpg, png到GDI+ Image
- android:scaleType="matrix"布局文件加载图片时候的显示方式
- 加载资源PNG图片
- MFC显示图片信息,当前测试png jpg两种图片
- CImage从资源中加载图片文件
- 从资源中加载jpg, png到GDI+ Image, bmp InvalidParameter问题
- 【nginx】nginx 无法加载css/js/gif/png等图片等文件
- VC 下加载 JPG / JPEG / GIF / PNG 图片最简单的方法
- 在VC6中基于dll开发插件用于各种图片显示(BMP/TGA/JPG/GIF/PNG/TIF/ICO/WMF/EMF/...)
- 批量加载图片资源时模拟器的显示而真机不显示的小问题