您的位置:首页 > 其它

MFC显示jpg图片

2012-07-13 14:37 260 查看
/*************************************************

  Function : ShowJPG

  Description : 在DC上按图片原始尺寸显示JPG图片

  Calls :

  Called By :

  Parameter : [CDC* pDC] --- DC

  : [CString strPath] --- 要显示的图片路径,建议全路径

  : [int x] --- DC上显示的X位置

  : [int y] --- DC上显示的Y位置

  : [bool OriginalSize] --- 是否按图片原始尺寸显示,false时将按DC大小缩放

  Return : bool --- 是否成功

  Author : Unknown

  Date : 2008-10-24

  Modify :

  *************************************************/

  bool ShowJPG(CDC* pDC,CString strPath, int x, int y, bool OriginalSize)

  {

  IStream *pStm;

  CFileStatus fstatus;

  CFile file;

  LONG cb;

  //打开文件并检测文件的有效性

  if (file.Open(strPath, CFile::modeRead) &&

  file.GetStatus(strPath,fstatus) &

  ((cb = fstatus.m_size) != -1))

  {

  HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);

  LPVOID pvData = NULL;

  if (hGlobal != NULL)

  {

  pvData = GlobalLock(hGlobal);

  if (pvData != NULL)

  {

  file.ReadHuge(pvData, cb);

  GlobalUnlock(hGlobal);

  CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);

  }

  }

  }

  else

  {

  return false;

  }

  //打开文件结束

  //显示JPEG图片

  IPicture *pPic;

  //load image from file stream

  if(SUCCEEDED(OleLoadPicture(pStm, fstatus.m_size, TRUE,IID_IPicture, (LPVOID*)&pPic)))

  {

  if (OriginalSize) //图片原始大小显示

  {

  long nWidth = 0, nHeight = 0; // 宽高,MM_HIMETRIC 模式,单位是0.01毫米

  pPic->get_Width( &nWidth ); // 宽

  pPic->get_Height( &nHeight ); // 高

  CSize sz( nWidth, nHeight );

  pDC->HIMETRICtoDP( &sz ); // 转换 MM_HIMETRIC 模式单位为 MM_TEXT 像素单位

  pPic->Render(pDC->m_hDC, 0, 0, sz.cx, sz.cy,

  0, nHeight, nWidth, -nHeight, NULL);

  }

  else

  {

  OLE_XSIZE_HIMETRIC hmWidth;

  OLE_YSIZE_HIMETRIC hmHeight;

  pPic->get_Width(&hmWidth);

  pPic->get_Height(&hmHeight);

  //get image height and width

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

  //use render function display image

  //按图片原始大小显示

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

  {

  pPic->Release();

  return false;

  }

  }

  if ( pStm ) pStm->Release(); // 释放 IStream 指针

  if ( pPic ) pPic->Release(); // 释放 IPicture 指针

  }

  else

  {

  return false;

  }

  return true;

  }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: