|
显示JPEG图像
位图文件最大的缺点就是压缩比较小,占用空间大。因此网页均不采用位图的格式显示,而是以JPEG或GIF格式显示。在Visual C++中显示JPEG图像并不像显示Bmp图像那么简单,它需要通过流操作来实现。具体思路是将JPEG文件加载到堆中,然后在堆中创建一个数据流,接着调用OleLoadPicture函数加载流中的数据到IPicture接口中,最后调用IPicture接口的Render方法输出图像信息。下面通过一个示例介绍在窗口中显示JPEG图像。 例如,在窗口中显示JPEG图像 (1)创建一个单文档/视图结构的应用程序,工程名称为“ShowJPEG”。 (2)向视图类中添加成员变量。 IStream *m_pStream; //定义流对象 IPicture *m_pPicture; //定义接口对象 OLE_XSIZE_HIMETRIC m_JPGWidth; //图像宽度 OLE_YSIZE_HIMETRIC m_JPGHeight; //图像高度 HGLOBAL hMem; //堆句柄 (3)在视图类的构造函数中从磁盘中加载JPEG图像到流中。 CShowJPEGView::CShowJPEGView() { CFile file; //定义文件对象 file.Open("angell.jpg",CFile::modeReadWrite); //打开文件 DWORD len = file.GetLength(); //获取文件长度 hMem = GlobalAlloc(GMEM_MOVEABLE,len); //在堆中分配内存 LPVOID pData = NULL; //定义一个指针对象 pData = GlobalLock(hMem); //锁定内存区域 file.ReadHuge(pData,len); //读取图像数据到堆中 file.Close(); //关闭文件 GlobalUnlock(hMem); //解锁对堆的锁定 CreateStreamOnHGlobal(hMem,TRUE,&m_pStream); //在堆中创建流 OleLoadPicture(m_pStream,len,TRUE,IID_IPicture,(LPVOID*)&m_pPicture); //加载图像 m_pPicture->get_Height(&m_JPGHeight); //获取图像高度 m_pPicture->get_Width(&m_JPGWidth); //获取图像宽度 } (4)在视图类的OnDraw方法中绘制JPEG图像。 void CShowJPEGView::OnDraw(CDC* pDC) { CShowJPEGDoc* pDoc = GetDocument(); //获取文档对象 ASSERT_VALID(pDoc); //验证文档对象 //绘制JPEG图像 m_pPicture->Render(pDC->m_hDC,0,0,(int)(m_JPGWidth/26.45),(int)(m_JPGHeight/26.45) ,0,m_JPGHeight,m_JPGWidth,-m_JPGHeight,NULL); } (5)运行应用程序,效果如图1所示。 ![]() 图1 显示JPEG图像 技巧:本实例是通过IPicture接口来绘制JPEG图像的,同样只要修改一下文件扩展名就可以直接绘制GIF的图像。 |