急!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;
}
}
这个星期搞不定情况就不妙了,什么饭都不容易吃啊,急死我了!
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;
}
}
这个星期搞不定情况就不妙了,什么饭都不容易吃啊,急死我了!
相关文章推荐
- MFC 加载jpg等图片
- wince下在OpenGLES中加载jpg、png格式的文件为纹理。
- wince 加载PNG图片
- VC下加载JPG/GIF/PNG图片的两种方法
- VC6中使用内存DC加载并显示JPG图片的注意事项
- VC下加载JPG/GIF/PNG图片的两种方法
- WinCE下加载各种类型图片,便于绘制图像的类
- Xcode 7 ImageNamed 方法加载jpg图片失败
- 用API OleLoadPicture通过IStream来加载JPG、GIF格式的图片
- 加载JPG / JPEG / GIF / PNG 格式的图片
- beamer加载动画+gif导出多个png或者jpg图片
- QT加载jpg、jpeg、gif图片不可见问题解决
- MFC 加载jpg图片
- [WM C++]从资源文件中加载显示png/jpg图片
- WINCE 加载JPG 旋转缩放
- 如何在程序中加载JPG图片?
- C/C++:如何在Vc程序中加载JPG图片
- delphi 中 image 控件加载bmp、JPG、GIF、PNG等图片的办法
- 使用流式文件读取或写入图片(jpg,png等)或视频(mp4)或音频(mp3)文件
- [WM C++]从资源文件中加载显示png/jpg图片