Wince下显示png图的方法

niuniumenghua 2010-08-02 02:08:57
Wince下显示png图的方法
牛牛猛wince的开发过程中,经常要涉及到GUI等开发,其强大的功能依赖于微软各种动态库和组件的支持, IPHONE效果的UI令我们眼花缭乱,有很多花稍的图片,和动态的显示效果,给用户带来超爽的用户体验。
用PNG格式的图片来实现这样的效果是个不错的注意,因为PNG的图可以包含透明度信息。这里主要介绍wince下PNG图片的显示方法,开发环境是EVC4.0sp4+wince5.0,源程序为实现PNG 显示作为我应用程序的GUI。
在一些多媒体项目中,图片显示是必不可少的,然而EVC的标准win32函数中,用于图片操作的只有LoadBitmap和BitBlt等位图函数,当然,用位图示是速度最快的一种方式,但是由于位图的不压缩性,使图片的体积非常大,使有些项目的开发板中,位图占用了大量的磁盘空间,如果使用JPG,GIF等高压缩比的图片,可以大大缩小程序的体积,然而EVC没有直接支持这些图片操作的函数,我们可以使用微软提供的组件COM去实现这个功能。
我们可以将我们图片资源文件放到SD卡或是flash中存贮,用的时候直接去存贮设备里调用就可以了,这样方便程序的UI的更新。

(1) 确保你的系统已经添加了组件:
PNG Decoder
Internet Explorer PNG Image Decoder
当然了既然是COM编程,所以COM组件还是必须要加进来的哦

(2) 在EVC中编写如下的函数:
//----------------------------------------------------------------------
// DrawImage - Display png picture.
//
void DrawImage(HWND hWnd, HDC hdc, LPCWSTR lpResourceName, int left, int top, int right, int bottom)
{
HRSRC hrRes;
HGLOBAL hGlobal;
LPSTR lpRes;
DWORD dwSize;
RECT rect;
HRESULT hr ; //•µ»Ø½á¹û


HMODULE hModule_Current;
IImagingFactory *pImageFactory = NULL; //Image工厂对象接口
IImage *pImage = NULL; //Image对象接口

//³õʼ»¯COM×é¼þ¶ÔÏó
if (FAILED(hr = CoInitializeEx(NULL, COINIT_MULTITHREADED)))
{

MessageBox (NULL, TEXT("COINIT_MULTITHREADED ERROR!"), TEXT("´íÎó"), MB_TOPMOST | MB_OK);

return;

}

hModule_Current = GetModuleHandle (NULL); //获得文件句柄
hrRes = FindResource (hModule_Current, lpResourceName, RT_RCDATA); //查找资源´
dwSize = SizeofResource (GetModuleHandle (NULL), hrRes); //获得资源文件大小
hGlobal = LoadResource (GetModuleHandle (NULL), hrRes); //加载文件
lpRes = (LPSTR)LockResource (hGlobal); //锁定资源文件


rect.bottom = bottom;
rect.top = top;
rect.right = right;
rect.left = left;

if (SUCCEEDED (CoCreateInstance (CLSID_ImagingFactory, //创建图像对象
NULL,
CLSCTX_INPROC_SERVER,
IID_IImagingFactory,
(void **)&pImageFactory)))
{
if (SUCCEEDED (hr=pImageFactory->CreateImageFromFile (lpResourceName, &pImage))) //从文件中创建对象
//(SUCCEEDED (pImageFactory->CreateImageFromBuffer (lpRes, dwSize, DISPOSAL_NONE, &pImage))) //从缓存中创建对象,不知道为啥不行,没仔细看
{
hdc = GetDC(hWnd);
pImage->Draw (hdc, &rect, NULL); //显示图像
// UnlockResource (hGlobal);
pImage->Release ();
}
pImageFactory->Release ();
}

CoUninitialize (); //释放COM资源

DeleteObject (hrRes);
}
上面的方法是个不错的方式,原来最项目时总是要把图像转化成raw根式的数据文件,很是麻烦,这样的就可以直接将资源文件复制到指定的位置很是方便了。
感谢网络上的大侠们的无私奉献!

...全文
656 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
QQ515311445 2010-12-21
  • 打赏
  • 举报
回复
现在是要做动画效果,不停的画PNG图片,Draw的参数已经调整过了,还有什么算法可以优化? 屏是只支持16bit.
Ei 2010-12-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 llxxhm 的回复:]
感觉IImage::Draw太慢了,WinCE5.0平台400M的CPU,128兆内存,分辨率800*480做出来的Iphone特效感觉有点慢.有什么方法解决?
[/Quote]
Draw慢了? 是16bit吗?优化下算法。
Ei 2010-12-20
  • 打赏
  • 举报
回复
用libpng 试试。
QQ515311445 2010-12-20
  • 打赏
  • 举报
回复
感觉IImage::Draw太慢了,WinCE5.0平台400M的CPU,128兆内存,分辨率800*480做出来的Iphone特效感觉有点慢.有什么方法解决?
91program 2010-08-02
  • 打赏
  • 举报
回复
个人推荐: cximage

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧