VC获取JPG、GIF文件的尺寸

 在显示图像之前,首先要获取到图像文件的存放路径,这里采用标准的文件打开对话框来选取图像文件,文件名存放在CString 型的变量m_sPath中:

 

CFileDialog dlg(TRUE,"jpg","*.jpg",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"JPEG文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif||",NULL);    
CString m_Path;  
if(dlg.DoModal()==IDOK)    
{    
m_Path=dlg.GetPathName();    
Invalidate();    
}
else
{
return;
}

 

 为简单计,图形显示的代码直接在视类中的OnDraw中编写,首先打开文件并判断文件的可用性,并把文件内容放到流接口IStream的对象pStm中:


IStream         *pStm;      
CFileStatus   fstatus;      
CFile             file;      
LONG           cb;      
LPVOID        pvData=NULL;      
HGLOBAL      hGlobal;  

 

// CFileStatus.m_size, GetLength(): 文件大小

if(file.Open(m_Path,CFile::modeRead)&&file.GetStatus(m_Path,fstatus)&&((cb=fstatus.m_size)!=-1))      
{      
hGlobal=GlobalAlloc(GMEM_MOVEABLE,cb);      

if(hGlobal!=NULL)      
{      
   if((pvData=GlobalLock(hGlobal))!=NULL)      
   {      
    file.ReadHuge(pvData,cb);      
    GlobalUnlock(hGlobal);      
    CreateStreamOnHGlobal(hGlobal,TRUE,&pStm);      
   }    
}    
}    

 

  然后,就直接调用OleLoadPicture函数从流中装载图像:


IPicture *pPic;  

 

由于该函数有时会导致失败,所以应当用SUCCEEDED宏来做一些适当的保护工作,只有在数据装载成功的前提下才能继续下面的图像显示工作:

 

if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))    
{  
OLE_XSIZE_HIMETRIC   hmWidth=0;      
OLE_YSIZE_HIMETRIC   hmHeight=0;      

pPic->get_Width(&hmWidth);      
pPic->get_Height(&hmHeight);      
CDC *p=GetDC();  

//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);

int lWidthPixels=MulDiv(hmWidth,p->GetDeviceCaps(LOGPIXELSX),2540);  
int lHeightPixels=MulDiv(hmHeight,p->GetDeviceCaps(LOGPIXELSY),2540);  

CString x;  
x.Format("宽度:%d 高度:%d",lWidthPixels,lHeightPixels );
AfxMessageBox(x);  

 

if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL))) {

    AfxMessageBox("渲染图像失败!");

    pPic->Release();

   }

   else

   AfxMessageBox("从流中装载图像失败!");


}      
GlobalFree(hGlobal);

 

其中,显示工作主要是由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控件的支持。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值