最近給一個客戶在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動畫,需要花很長時間。