vc加载PNG以及JPG等图片资源并绘制图片

1.使用CImage的Load方法载入IStream然后使用其方法Draw绘制到指定设备上下文。

BOOL CBmpButton::LoadFromResource(UINT nResId,LPCTSTR lpResFolder,CImage& image)
{
 image.Destroy();
 HRSRC hRsrc =  FindResource(AfxGetResourceHandle(),MAKEINTRESOURCE(nResId),lpResFolder);
 if (NULL == hRsrc)
 {
  return FALSE;
 }

 HGLOBAL hSrcglob = LoadResource(AfxGetResourceHandle(),hRsrc);
 if (NULL == hRsrc)
 {
  return FALSE;
 }

 DWORD dwRsrcSize = SizeofResource(AfxGetResourceHandle(),hRsrc);
 LPVOID pRsrcData = LockResource(hSrcglob);
 if (NULL == pRsrcData || dwRsrcSize <= 0)
 {
  FreeResource(hSrcglob);
  hSrcglob = NULL;
  return FALSE;
 }

 HGLOBAL hData = GlobalAlloc(GMEM_MOVEABLE,dwRsrcSize);
 if (NULL == hData)
 {
  FreeResource(hSrcglob);
  return FALSE;
 }

 LPVOID pData = GlobalLock(hData);
 memcpy(pData,pRsrcData,dwRsrcSize);
 GlobalUnlock(hData);

 UnlockResource(hSrcglob);
 FreeResource(hSrcglob);
 hSrcglob = NULL;

 IStream* pStream = NULL;
 HRESULT hRet = CreateStreamOnHGlobal(hData,FALSE,&pStream);
 if (FAILED(hRet))
 {
  FreeResource(hSrcglob);
  hSrcglob = NULL;

  GlobalFree(hData);
  hData = NULL;
  return FALSE;
 }

 if(FAILED(image.Load(pStream)))
 {
  FreeResource(hSrcglob);
  hSrcglob = NULL;

  GlobalFree(hData);
  hData = NULL;
  return FALSE;
 }

 for(int i = 0; i < image.GetWidth(); i++) 
 { 
  for(int j = 0; j < image.GetHeight(); j++) 
  { 
   unsigned char* pucColor = reinterpret_cast<unsigned char *>(image.GetPixelAddress(i , j)); 
   pucColor[0] = pucColor[0] * pucColor[3] / 255; 
   pucColor[1] = pucColor[1] * pucColor[3] / 255; 
   pucColor[2] = pucColor[2] * pucColor[3] / 255; 
  } 
 } 

 GlobalFree(hData);
 hData = NULL;

 return TRUE;
}

 

2.使用LoadPictrueFromStream绘制API去绘制,要注意图片是倒置的,此处用IPictrue接口(从IStream接口创建出来),此处补贴代码。

 

注意:

VC加载 png 没有透明功能,要想使加载到程序中的png图像有透明工能,请在加载图片后,加入以下代码,自己处理透明颜色:

Cimage mimage;
HRESULT  hr =   mimage.Load(szImageName);
for ( int  i = 0; i < mimage.GetWidth(); i++)  
{  
     for ( int  j = 0; j < mimage.GetHeight(); j++)  
     {  
         unsigned  char * pucColor =  reinterpret_cast <unsigned  char  *>(mimage.GetPixelAddress(i , j));  
         pucColor[0] = pucColor[0] * pucColor[3] / 255;  
         pucColor[1] = pucColor[1] * pucColor[3] / 255;  
         pucColor[2] = pucColor[2] * pucColor[3] / 255;  
     }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝壳里的沙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值