微信公众号 
图码生活

每天发布有五花八门的文章,各种有趣的知识等,期待您的订阅与参与
电脑报 1992-2001 十年文章全集
电脑报 1992-2001 十年文章全集
包含从 1992 年 - 2001 年间,两万余篇期刊文章,查询最少输入两个字符
随便看看
读取中
读取中
标题如何显示多种图像格式
栏目软件世界
作者刘涛
发布2001年46期
  随着计算机技术的迅速发展,计算机图像技术已经成为新推出的软件或操作系统不可缺少的组成部分。许多朋友想在自己开发的程序中显示图像以美观自己的软件,但图像格式多种多样,如何快速显示各种格式的图像是一个值得研究的问题。经过多方面查找资料,笔者掌握了一种显示图像的方法,过程相当简单,并可以同时显示多种图像格式的文件,下面是方法的实现源代码及部分注释。
  该方法首先声明一个IStream流对象指针*pStrm、图像对象指针*pPicture然后利用一个Cfile对象file将图像文件的数据读进一个数据块,用该数据块生成流对象,方法实现过程中最重要的一点是利用了Active技术提供的图像对象Ipicture,它是Active技术提供的管理图像的一个最主要的接口,OleLoadPicture()用得到的流对象pStrm初始化图像对象pPicture,利用它的成员函数IPicture::get_Width()、IPicture::get_Height()得到图像的宽、高等特性;Ipicture::Render()在视图上把图像显示出来。上述函数的具体使用方法可以查阅微软的在线帮助MSDN。为了演示该方法的实现过程,利用ClassWizard定义一个菜单响应函数OnImageShow(),在该函数内对图像文件进行显示操作:
  void CMainFrame::OnImageShow()
  {
  CString filename1;
  static char szFilter[]=“BMP(*.bmp)|*.bmp|JPG(*.jpg)|*.jpg|GIF(*.gif)|*.gif|TIF(*tif)|(*.tif)||”;
  CFileDialog dlg(TRUE,“gif”,NULL,OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,szFilter);
  if(dlg.DoModal()==IDOK)
  filename1=dlg.GetPathName();
  IPicture *pPicture; //声明OLE提供的图像对象;
  IStream *pStrm;//声明一个流对象;
  CFileStatus fstatus;
  CFile file;
  LONG cb;
  if (file.Open(filename1,CFile::modeRead)&file.GetStatus(filename1, fstatus)&((cb = fstatus.m_size)!= -1))  
  {
  HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
  LPVOID pvData = NULL;
  CDC *pDC;
  pDC=(this->GetActiveView())->GetDC();//得到活动视图的设备上下文;
  if(hGlobal != NULL)
  {
  if ((pvData = GlobalLock(hGlobal))!= NULL)
  {
  file.ReadHuge(pvData,cb);//将图像文件数据读入内存;
  GlobalUnlock(hGlobal);
  CreateStreamOnHGlobal(hGlobal, TRUE, &pStrm); //创建流对象
  if(SUCCEEDED(OleLoadPicture(pStrm,fstatus.m_size,TRUE,IID_IPicture,LPVOID*)&pPicture)))
  //根据流对象pStrm初始化图像对象pPicture;
  {
  OLE_XSIZE_HIMETRIC Width;
  OLE_YSIZE_HIMETRIC Height;
  pPic->get_Width(&Width);
  pPic->get_Height(&Height);
  //得到图像的宽、高尺寸,注意该尺寸的逻辑单位不是图像的像素。
  if (FAILED (pPicture->Render(*pDC,100,50,300,200,0,Height,Width,- Height,NULL)))  
  //在初始点(100,50)宽为200、高为150的矩形中显示图像;
  AfxMessageBox(“Failed To Render The picture!”);
  pPic->Release();
  }
  else
  AfxMessageBox(“Error Loading Picture From Stream!”);
  }
  }
  }
  else
  AfxMessageBox(“Cant Open Image File!”);
  }
  在上文中,我们结合一个简单的例子讲解了具体显示各种格式图像文件的方法,程序在Windows 2000、Visual C++6.0编译环境下通过。经实验后发现可以成功的显示BMP、JEPG、GIF格式的文件,其他的如TIFF、PNG、WMF、PCX等格式文件大家可以自行摸索。