您的位置:首页 > 编程语言 > C语言/C++

[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文件,还需要自己封装,裸的项目文件将近百个,编译都要老长时间。终于松口气,又完成一个任务 :)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息