最近给一个客户在Sigma 865x高清平台上定制了WinCE6.0。客户需要一个图片浏览软件。因为该款CPU是MIPS的内核,共享的现成软件很少。所以决定移植或者做一个给客户。
CxImage是一个开源图片处理库,而且提供了Pocket PC2003的一个可以运行的demo。于是决定先移植,如果移植的性能不能满足需求,再考虑用CE下提供的COM写一个。
虽然该demo可以在Pocket PC2003上运行,但要在WinCE下运行,需要修改几个bugs:
1. 类作为参数时,一般传递类的引用,不使用类的指针作为参数。
bool CxImage::Decode(FILE *hFile, DWORD imagetype)
{
CxIOFile file(hFile);
return Decode(&file,imagetype);
}
修改为:
bool CxImage::Decode(FILE *hFile, DWORD imagetype)
{
CxIOFile file(hFile);
//return Decode(&file,imagetype);
return Decode(file,imagetype);
}
虽然红色代码在Pocket PC2003上运行正常,但在WinCE6.0下会有异常。当然需要重载
一个Decode方法。
2. GIF动画不能播放:
在完成了JPG,BMP,PNG以及TIF图片的显示后,移植GIF后,发现GIF动画不仅不能播放,
而且只要做打开GIF动画的操作,CxImage会报堆栈空间不够,退出。
将堆栈Reserve Size与Commit size调整为如下图所示大小后,GIF动画可以播放了。
3. GIF播放时,打开另外的图片时,CxImage报异常然后退出。
这是因为GIF动画播放是用一个单独的线程实现的。当GIF正在播放时打开另外的图片文件,由于只是通知播放线程需要终止但却没有
等待播放线程终止释放资源。增加一个播放线程与主线程同步的信号。当主线程通知播放线程需要终止时,主线程等待播放线程的终止
信号。收到播放终止信号后,再开始另外的任务。
除了以上修改外,为了满足浏览,还做了一些新的窗口变化方面的处理。例如任何图片可以适中显示(不扭曲,不变形),也可以放大
缩小原图显示等等。
4. 内存泄露:
移植完GIF后,做一些基本的测试,发现有内存泄露问题,而且很严重。当打开GIF正在显示时,打开另外的图片。
有时图片不能显示,报内存不足;只有一些小的图片可以打开。察看系统的内存使用情况,发现内存几乎被使用完。
修改了内存泄露问题后,算是初步移植完成了。
虽然CxImage可以在Sigma 上跑起来,但是由于CxImage需要的内存很多,而且效率比较低,打开1920x1440的图片或者清晰度高
的GIF动画,需要花很长时间。
本文记录了CxImage库在WinCE6.0平台上的移植过程及遇到的问题解决方法,包括参数传递方式修正、GIF动画播放、内存泄漏修复等。
2803





