VC下显示JPG,GIF图象的方法

来源:计算机等级考试    发布时间:2012-08-28    计算机等级考试视频    评论

  VC下显示JPG,GIF的图像的显示就程序开发过程中要用到的一个模块,今天我们就来谈一谈它的具体的实现方法。
  在显示图像之前,首先要获取到图像文件的存放路径,这里采用标准的文件打开对话框来选取图像文件,文件名存放在CString型的变量m_sPath中:
  CFileDialog dlg(TRUE,/"jpg/",/"*.jpg/",
  OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
  /"JPEG文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif||/",NULL);
  if(dlg.DoModal()==IDOK)
  {
  m_sPath=dlg.GetPathName();
  Invalidate();
  }
  为简单计,图形显示的代码直接在视类中的OnDraw中编写,首先打开文件并判断文件的可用性,并把文件内容放到流接口IStream的对象pStm中:
  IStream *pStm;
  CFileStatus fstatus;
  CFile file;
  LONG cb;
  ……
  if (file.Open(m_Path,CFile::modeRead)&&file.GetStatus(m_Path,fstatus)&& ((cb = fstatus.m_size) != -1))
  {
  HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
  LPVOID pvData = NULL;
  if (hGlobal != NULL)
  {
  if ((pvData = GlobalLock(hGlobal)) != NULL)
  {
  file.ReadHuge(pvData, cb);
  GlobalUnlock(hGlobal);
  CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
  }
  }
  }
  然后,就直接调用OleLoadPicture函数从流中装载图像:
  IPicture *pPic;
  ……
  OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic));
  由于该函数有时会导致失败,所以应当用SUCCEEDED宏来做一些适当的保护工作,只有在数据装载成功的前提下才能继续下面的图像显示工作:
  if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
  {
  OLE_XSIZE_HIMETRIC hmWidth;
  OLE_YSIZE_HIMETRIC hmHeight;
  pPic->get_Width(&hmWidth);
  pPic->get_Height(&hmHeight);
  double fX,fY;
  ……
  fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
  fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
  if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
  AfxMessageBox(/"渲染图像失败!/");
  pPic->Release();
  }
  else
  AfxMessageBox(/"从流中装载图像失败!/");
  其中,显示工作主要是由IPicture接口对象的Render函数来完成的,该函数主要用来将图片的指定部分画到指定的设备环境的指定位置。原型如下:
  HRESULT Render( HDC hdc, //渲染图像用的设备环境句柄
  long x, //在hdc上的水平坐标
  long y, //在hdc上的垂直坐标
  long cx, //图像宽度
  long cy, //图像高度
  OLE_XPOS_HIMETRIC xSrc, //在源图像上的水平偏移
  OLE_YPOS_HIMETRIC ySrc, //在源图像上的垂直偏移
  OLE_XSIZE_HIMETRIC cxSrc,//在源图像上水平拷贝的数量
  OLE_YSIZE_HIMETRIC cySrc,//在源图像上垂直拷贝的数量
  LPCRECT prcWBounds //指向目标图元设备环境句柄的指针);
  小结:到此为止,通过上述代码已经能够在程序的客户区内显示JPEG、GIF等标准的图像了,但对于有多帧图片(即有动画)的GIF格式的图像,目前还只能显示第一帧,如要完整的显示GIF 动画的全过程,还需要外部Active X控件的支持。

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答