现在的位置: 首页 > 综合 > 正文

VC下显示JPG,BMP,GIF等图像格式

2012年10月10日 ⁄ 综合 ⁄ 共 4151字 ⁄ 字号 评论关闭
方法一:用COM组件的 IPicture接口(VC)

方法二:用GDI+(VC)

EVC下显示图片

 用COM组件的 IPicture接口(VC)

 在OnPaint   或  OnDraw中加入下代码即可 (注意 屏蔽掉 CXXDialog::OnPaint  CXX::OnDraw)

 dc.SetBkMode( TRANSPARENT );

  CFile mFile; 
  LONG  nLength; 

  //1 打开文件并获得文件的真实大小
  if ( mFile.Open( _T( "./res/test.jpg" ),CFile::modeRead )
   &&( ( nLength = mFile.GetLength() ) > 0 ) ) 
  { 
   //2 从堆中分配指定数量字节的一整块,这时系统无法提供零零碎碎的局部或全局的堆
   HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, nLength ); 
   LPVOID pvData = NULL; 
   if ( hGlobal != NULL ) 
   { 
    //3 锁定全局内存对象并返回它的首地址
    if ( ( pvData = GlobalLock(hGlobal) ) != NULL ) 
    { 
     //4 把文件内容读进全局内存对象的地址空间中
     mFile.Read( pvData, nLength );
     mFile.Close();

     //5 GlobalUnlock函数把以GMEM_MOVEABLE方式分配的内存对象的锁定计数器减1
     GlobalUnlock( hGlobal ); 

     //6 从全局内存中创建stream对象,第二个参数指定当stream释放时是否自动释放全局内存
     IStream *pStm;
     CreateStreamOnHGlobal( hGlobal, TRUE, &pStm) ; 

     //7 创建一个新的picture对象并用stream对象中的内容初始化
     IPicture *pPic; 
     if( SUCCEEDED( OleLoadPicture( pStm, nLength, TRUE, IID_IPicture, (LPVOID*)&pPic ) ) ) 
     { 
      //8 释放不要的stream对象并清空stream指针
      pStm->Release();
      pStm=NULL;
     
      OLE_XSIZE_HIMETRIC mWidth; 
      OLE_YSIZE_HIMETRIC mHeight; 

      //9 得到picture对象中图片的宽和高
      pPic->get_Width( &mWidth ); 
      pPic->get_Height( &mHeight ); 

      CRect rc;
      GetClientRect( &rc );
      double fX,fY; 

      //10 GetDeviceCaps(HORZRES)得到屏幕的宽度(单位:像素)
      //    GetDeviceCaps(HORZSIZE)得到屏幕的宽度(单位:毫米)
      fX = (double) dc.GetDeviceCaps(HORZRES) * (double)mWidth / ( (double)dc.GetDeviceCaps( HORZSIZE ) * 100.0 ); 
      fY = (double) dc.GetDeviceCaps(VERTRES) * (double)mHeight / ( (double)dc.GetDeviceCaps( VERTSIZE ) *100.0 ); 

     
      
      //11 把图像显示在dc中

      if( FAILED( pPic->Render( dc.GetSafeHdc(), 0, 0, (DWORD)fX , (DWORD)fY , 0, mHeight, mWidth, -mHeight, NULL ) ) ) 
       AfxMessageBox( _T("渲染图片失败") );

      /*根据背景大小缩放图片
      CRect rcClient;
      GetClientRect( &rcClient );
      
      BOOL bWidth = rcClient.Width() / fX > rcClient.Height() / fY;
      if ( bWidth )
      {
       if( FAILED( pPic->Render( dc.GetSafeHdc(), 0, 0, (DWORD)rcClient.Width() , (DWORD)rcClient.Width() * fY / fX , 0, mHeight, mWidth, -mHeight, NULL ) ) ) 
        AfxMessageBox( _T("渲染图片失败") );
      }
      else
      {
       if( FAILED( pPic->Render( dc.GetSafeHdc(), 0, 0, (DWORD)rcClient.Height() * fX/ fY, (DWORD)rcClient.Height() , 0, mHeight, mWidth, -mHeight, NULL ) ) ) 
        AfxMessageBox( _T("渲染图片失败") );
      }
      */
      
      //12 释放不要的picture对象,并把指针清空
      pPic->Release(); 
      pPic=NULL;

      //13 释放不要的全局内存对象,这个千万别忘了(32位程序不需要这行,系统会自动释放;16位程序一定要)
      FreeResource(hGlobal);

     }
     else
      AfxMessageBox( _T("从stream中装载图片失败") );

    } 
   }
   else
    AfxMessageBox( _T("分配内存失败") );
  } 
  else
   AfxMessageBox( _T("打开文件失败") );

用GDI+(VC)

添加Gdiplus.lib到工程中

头文件中添加

#include "Gdiplus.h" 
using namespace Gdiplus; 

添加类成员变量

GdiplusStartupInput m_gdiPlusInPut;
ULONG_PTR m_gdiPlusToken;

构造函数中初始化GDI+ 

 GdiplusStartup( &m_gdiPlusToken, &m_gdiPlusInPut, NULL ); 

析构函数中 //销毁GDI+ 

GdiplusShutdown(gdiplusToken); 

OnPaint()中

 //CDialog::OnPaint();
  CPaintDC dc( this );

 //建立图形对象 
  Graphics mGraphics( dc.GetSafeHdc() );

  //装入图像文件 

  Image img( L"./res/test.jpg", TRUE );
 

 //在指定区域pdestPoints显示图像 

  /*//根据背景大小按比例缩放

  CRect rcClient;
  GetClientRect( &rcClient );

  
  BOOL bWidth = rcClient.Width() / img.GetWidth() > rcClient.Height() / img.GetHeight();
  if ( bWidth )
  {
   mGraphics.DrawImage( &img, 0, 0, rcClient.Width(), rcClient.Width() * img.GetHeight() / img.GetWidth() );
  }
  else
  {
   mGraphics.DrawImage(&img, 0, 0, rcClient.Height() * img.GetWidth() / img.GetHeight(), rcClient.Height() );
  }
  */

//原始大小
  mGraphics.DrawImage(&img, 0, 0, img.GetWidth(), img.GetHeight() );

EVC下显示图片:

void CXXDlg::OnPaint() 
{
 CPaintDC dc(this); // device context for painting

 dc.SetBkMode( TRANSPARENT );
 CBitmap mBitmap;
 mBitmap.Attach( SHLoadImageFile( _T( "./player.jpg" ) ) );

 BITMAP mInfo;
 mBitmap.GetBitmap( &mInfo );

 CDC mPicDC;
 mPicDC.CreateCompatibleDC( &dc );
 CBitmap* pOldBitmap = mPicDC.SelectObject( &mBitmap );
 dc.BitBlt( 0, 0, mInfo.bmWidth, mInfo.bmHeight, &mPicDC, 0, 0, SRCCOPY );

 mPicDC.SelectObject( pOldBitmap );
 mBitmap.DeleteObject();
}

抱歉!评论已关闭.