如何显示多种图像格式

Author: 刘涛 Date: 2001年 46期

?牐犓孀偶扑慊际醯难杆俜⒄梗扑慊枷窦际跻丫晌峦瞥龅娜砑虿僮飨低巢豢扇鄙俚淖槌刹糠帧P矶嗯笥严朐谧约嚎⒌某绦蛑邢允就枷褚悦拦圩约旱娜砑枷窀袷蕉嘀侄嘌绾慰焖傧允靖髦指袷降耐枷袷且桓鲋档醚芯康奈侍狻>喾矫娌檎易柿希收哒莆樟艘恢窒允就枷竦姆椒ǎ滔嗟奔虻ィ⒖梢酝毕允径嘀滞枷窀袷降奈募旅媸欠椒ǖ氖迪衷创爰安糠肿⑹汀?
  ?牐牳梅椒ㄊ紫壬饕桓鯥Stream流对象指针*pStrm、图像对象指针*pPicture然后利用一个Cfile对象file将图像文件的数据读进一个数据块,用该数据块生成流对象,方法实现过程中最重要的一点是利用了Active技术提供的图像对象Ipicture,它是Active技术提供的管理图像的一个最主要的接口,OleLoadPicture()用得到的流对象pStrm初始化图像对象pPicture,利用它的成员函数IPicture::get_Width()、IPicture::get_Height()得到图像的宽、高等特性;Ipicture::Render()在视图上把图像显示出来。上述函数的具体使用方法可以查阅微软的在线帮助MSDN。为了演示该方法的实现过程,利用ClassWizard定义一个菜单响应函数OnImageShow(),在该函数内对图像文件进行显示操作:
  ?牐爒oid CMainFrame::OnImageShow()
  ?牐爗
  ?牐燙String filename1;
  ?牐爏tatic char szFilter[]=“BMP(*.bmp)|*.bmp|JPG(*.jpg)|*.jpg|GIF(*.gif)|*.gif|TIF(*tif)|(*.tif)||”;??
  ?牐燙FileDialog dlg(TRUE,“gif”,NULL,OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,szFilter);?牔?
  ?牐爄f(dlg.DoModal()==IDOK)??
  ?牐爁ilename1=dlg.GetPathName();
  ?牐營Picture  *pPicture; //声明OLE提供的图像对象;
  ?牐營Stream *pStrm;//声明一个流对象;
  ?牐燙FileStatus fstatus;
  ?牐燙File file;
  ?牐燣ONG cb;
  ?牐爄f (file.Open(filename1,CFile::modeRead)&file.GetStatus(filename1, fstatus)&((cb = fstatus.m_size)!= -1))?牐?
  ?牐爗
  ?牐燞GLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);?牔?
  ?牐燣PVOID pvData = NULL;
  ?牐燙DC *pDC;??
  ?牐爌DC=(this->GetActiveView())->GetDC();//得到活动视图的设备上下文;
  ?牐爄f(hGlobal != NULL)
  ?牐爗??
  ?牐爄f ((pvData = GlobalLock(hGlobal))!= NULL)
  ?牐爗
  ?牐爁ile.ReadHuge(pvData,cb);//将图像文件数据读入内存;
  ?牐燝lobalUnlock(hGlobal);
  ?牐燙reateStreamOnHGlobal(hGlobal, TRUE, &pStrm); //创建流对象
  if(SUCCEEDED(OleLoadPicture(pStrm,fstatus.m_size,TRUE,IID_IPicture,LPVOID*)&pPicture)))
  ?牐?//根据流对象pStrm初始化图像对象pPicture;
  ?牐爗??
  ?牐燨LE_XSIZE_HIMETRIC Width;
  ?牐燨LE_YSIZE_HIMETRIC Height;??
  ?牐爌Pic->get_Width(&Width);?牔?
  ?牐爌Pic->get_Height(&Height);
  ?牐?//得到图像的宽、高尺寸,注意该尺寸的逻辑单位不是图像的像素。
  ?牐爄f (FAILED (pPicture->Render(*pDC,100,50,300,200,0,Height,Width,- Height,NULL)))?牐牐?
  ?牐?//在初始点(100,50)宽为200、高为150的矩形中显示图像;
  ?牐燗fxMessageBox(“Failed To Render The picture!”);?牔?
  ?牐爌Pic->Release();
  ?牐爙
  ?牐爀lse
  ?牐燗fxMessageBox(“Error Loading Picture From Stream!”);
  ?牐爙??
  ?牐爙??
  ?牐爙??
  ?牐爀lse
  ?牐燗fxMessageBox(“Cant Open Image File!”);?牔?
  ?牐爙
  ?牐犜谏衔闹校颐墙岷弦桓黾虻サ睦咏步饬司咛逑允靖髦指袷酵枷裎募姆椒ǎ绦蛟赪indows 2000、Visual C++6.0编译环境下通过。经实验后发现可以成功的显示BMP、JEPG、GIF格式的文件,其他的如TIFF、PNG、WMF、PCX等格式文件大家可以自行摸索。