WindowsCE & Linux 应用开发

从来疾风有劲草,自古沃土少苍松.

导航

急!WinCE下加载流式JPG图片

        最近两个星期一直在忙一个地图引擎的开发,难度很大,以致于周末跑同学那里求援,问题解决了一大半了,以为一切搞定的时候,致命的问题出现了,winCE不支持利用流加载图像OleLoadPicture函数!已经搞了三天了,还是没有解决。
        MFC提供的CWnd只有默认加载BMP文件的接口,对JPG等图像是不支持。加载.JPG格式的图片,有两种方法,用流对象+IPicture接口加载;IImage接口加载。
        对于这两种方法我写了两个VC的测试程序,可以,就性能上采用流对象加载要比IImage接口快,要命的我把代码移到PPC上就挂了,IImage接口可以实现显示但是必须提供图片的绝对路径和格式,也就是说图片必须以文件的方式存在,如果是内存的一段图片数据则没有办法,而我上星期刚把所有图片整合为一个二进制文件,拿到的全部是数据流,所有用IImage接口是没戏了;采用
IPicture接口应该是最正确的办法,对于手持设备,CPU频率本来就低,直接将图片数据加载显示,性能上要提升很多,特别是对于我们这样频繁的LOAD图片。
          郁闷的是OleLoadPictureAPI WinCE不支持!也想过用第三方的库Jpeglib来实现,昨天搞到晚上8点,还有8个错误解决不了,应该是Jpeglib版本不对,Jpeglib对于图象的压缩和转换有很好的支持,但是我们用不到,这个想法基本被否定了。

采用IPicture接口的实现
-----------------------------------------------------------------------
IPicture *m_picture;
OLE_XSIZE_HIMETRIC m_width;
OLE_YSIZE_HIMETRIC m_height;

CString m_filename(
"D:\\009.jpg");//文件名

CFile m_file(m_filename,CFile::modeRead );

//获取文件长度
DWORD m_filelen 
= m_file.GetLength(); 

//在堆上分配空间
HGLOBAL m_hglobal 
= GlobalAlloc(GMEM_MOVEABLE,m_filelen);

LPVOID pvdata 
= NULL;
//锁定堆空间,获取指向堆空间的指针
pvdata 
= GlobalLock(m_hglobal);

//将文件数据读区到堆中
m_file.ReadHuge(pvdata,m_filelen);

IStream
*  m_stream;

GlobalUnlock(m_hglobal);

//在堆中创建流对象
CreateStreamOnHGlobal(m_hglobal,
TRUE,&m_stream);

//利用流加载图像
OleLoadPicture(m_stream,m_filelen,
TRUE,IID_IPicture,(LPVOID*)&m_picture);

m_picture
->get_Width(&m_width);
m_picture
->get_Height(&m_height);    

CDC
* dc = GetDC();

m_IsShow 
= TRUE;
CRect rect;
GetClientRect(rect);
SetScrollRange(SB_VERT,
0,(int)(m_height/26.45)-rect.Height());
SetScrollRange(SB_HORZ,
0,(int)(m_width/26.45)-rect.Width());

m_picture
->Render(*dc,1,50,(int)(m_width/26.45),(int)(m_height/26.45),0,m_height,m_width,-m_height,NULL);


采用IImage接口的实现
-------------------------------------------------------------------
HBITMAP CImageLoader::loadImageFile( CString &strFileName)
{
 IImagingFactory *pImgFactory =NULL; 
    IImage *pImage =NULL; 
    CoInitializeEx(NULL,COINIT_MULTITHREADED); 
 HBITMAP hResult =0;  
    if   (SUCCEEDED(CoCreateInstance(CLSID_ImagingFactory, 
                                     NULL, 
                                     CLSCTX_INPROC_SERVER, 
                                     IID_IImagingFactory, 
                                     (void   **)&pImgFactory))) 
 { 
     ImageInfo imageInfo; 
        if(SUCCEEDED(pImgFactory->CreateImageFromFile(strFileName,&pImage)) 
     && SUCCEEDED(pImage->GetImageInfo(&imageInfo))) 
        { 
   CWindowDC dc(0); 
   CDC dcBitmap; 
   dcBitmap.CreateCompatibleDC(&dc); 
   hResult =CreateCompatibleBitmap(dc.GetSafeHdc(),imageInfo.Width,imageInfo.Height); 
   if(hResult){ 
    HGDIOBJ   hOldBitmap   =   dcBitmap.SelectObject(hResult); 
                pImage->Draw(dcBitmap.GetSafeHdc(),CRect(0,0,imageInfo.Width,imageInfo.Height),NULL); 
    dcBitmap.SelectObject(hOldBitmap); 
    
   } 
   pImage->Release(); 
        } 

        pImgFactory->Release();  
CoUninitialize(); 
  return hResult;
}
      
 }
    
         这个星期搞不定情况就不妙了,什么饭都不容易吃啊,急死我了!

posted on 2008-06-26 13:00  zrs  阅读(2601)  评论(3编辑  收藏  举报