加载不同格式类型图片封转函数(流中加载)

本文详细介绍了在C++中初始化并从资源中加载不同格式的图片(如JPG、PNG)的方法,包括资源查找、内存分配、复制和创建流对象等步骤,并演示了如何将加载的图片进行贴图显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 定义各种图片变量

 Gdiplus::Image *m_bgImg;
 Gdiplus::Image *m_logoImg;
 Gdiplus::Image *m_titleImg;
 Gdiplus::Image *m_shutImg;
 Gdiplus::Image *m_tvBg;
 Gdiplus::Image *m_autoImg;
 Gdiplus::Image *m_powerON;
 Gdiplus::Image *m_powerONOver;

加载

int iResult = 0;

 //加载资源图片
 iResult += LoadImageFromResourceID( IDR_BG_JPG, RES_JPG, m_bgImg );

函数实现


//////////////////////////////////////////////////////////////////////////
//
// LoadImageFromResourceID 从资源中加载图片,然后从内存中创建Image对象
//
// 程序退出的时候需要手动删除pImg,释放资源
//
//////////////////////////////////////////////////////////////////////////

BOOL CMonitorSystemDlg::LoadImageFromResourceID( UINT nResID, UINT nResType, Gdiplus::Image* &pImg )
{
 HRSRC hRes = NULL;

 if ( nResType == RES_JPG )
 {
  hRes = FindResourceW( NULL, MAKEINTRESOURCEW( nResID ), L"JPG" );
 }
 if ( nResType == RES_PNG )
 {
  hRes = FindResourceW( NULL, MAKEINTRESOURCEW( nResID ), L"PNG" );
 }

 if ( NULL == hRes )
 {
  return FALSE;
 }

 DWORD dwSize = SizeofResource( NULL, hRes );

 HGLOBAL hGlobal = LoadResource( NULL, hRes );
 HGLOBAL hMem = GlobalAlloc( GMEM_FIXED | GMEM_MOVEABLE, dwSize );

 if ( NULL == hMem )
 {
  return FALSE;
 }

 BYTE* lpRes = ( BYTE* )LockResource( hGlobal );
 BYTE* lpMem = ( BYTE* )GlobalLock( hMem );

 memcpy( lpMem, lpRes, dwSize );

 IStream* pStream = NULL;

 CreateStreamOnHGlobal( lpMem, TRUE, &pStream );

 GlobalUnlock( hMem );

 pImg = Image::FromStream( pStream );

 pStream->Release();

 return TRUE;
}

释放资源句柄

#define ReleasePtr( p ) { if ( p ){ delete p; p = NULL; }}

 ReleasePtr( m_bgImg );

贴图方式显示

 CDC* pDC = pDlg->GetDC();

  if ( hMemDC == NULL )
  {
   hMemDC = CreateCompatibleDC( pDC->m_hDC );
   hBitmap = CreateCompatibleBitmap( pDC->m_hDC, pDlg->m_rtFullScreen.Width(), pDlg->m_rtFullScreen.Height());
   SelectObject( hMemDC, hBitmap );
  }

  Graphics graphics( hMemDC );

  graphics.DrawImage( pDlg->m_bgImg, 0, 0, pDlg->m_rtBg.left, pDlg->m_rtBg.top, pDlg->m_rtBg.Width(), pDlg->m_rtBg.Height(), UnitPixel );


  BitBlt( pDC->m_hDC, 0, 0, pDlg->m_rtFullScreen.Width(), pDlg->m_rtFullScreen.Height(), hMemDC, 0, 0, SRCCOPY );

  pDlg->ReleaseDC( pDC );

 

注:资源释放很重要
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值