您的位置:首页 > 其它

急!WinCE下加载流式JPG图片

2008-06-26 13:00 197 查看
最近两个星期一直在忙一个地图引擎的开发,难度很大,以致于周末跑同学那里求援,问题解决了一大半了,以为一切搞定的时候,致命的问题出现了,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;
}

}

这个星期搞不定情况就不妙了,什么饭都不容易吃啊,急死我了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: