科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件VC下显示JPG GIF图象的方法

VC下显示JPG GIF图象的方法

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

VC下显示JPG,GIF的图像的显示就程序开发过程中要用到的一个模块,今天我们就来谈一谈它的具体的实现方法。

作者:佚名 来源:中国自学编程网 2007年11月17日

关键字: VC jpg GIF 图象

  • 评论
  • 分享微博
  • 分享邮件
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 动画的全过程,还需要外部ActiveX控件的支持。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章