急!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;
}
}
这个星期搞不定情况就不妙了,什么饭都不容易吃啊,急死我了!