CImage

本文介绍了如何利用CImage类从MSDN文档中实现PNG透明贴图的效果。通过加载图片,结合不同版本的TransparentBlt函数,可以将指定颜色作为透明色,实现图像在目标DC上的透明绘制。这种方法比直接使用Draw更方便地处理了透明效果。

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

前几天发了 关于透明bmp贴图的博客,在背景图与贴图背景没有一致像素的情况下,通过位运算实现了透明贴图,对于图片的要求太高,容易出现“事故”


实际上,使用png透明贴图效果更好,这要用到CIamge 类(MSDN文档https://msdn.microsoft.com/zh-cn/library/bwea7by5.aspx)

素材图 可以使用PS  (添加图层+魔棒抠图) 很简单的制作一个透明色png图



CIamge的头文件

#include <atlimage.h>


主要使用的函数

Load  加载图片

HRESULT Load(  
   LPCTSTR pszFileName    //文件路径
) throw( );  
  
  
HRESULT Load(  
   IStream* pStream   //文件指针
) throw(); 

Draw 绘图函数

    BOOL Draw(  
       HDC hDestDC,         //目标设备环境DC的句柄  
       int xDest,           //目的矩形的左上角X坐标(逻辑单位)  
       int yDest,           //目的矩形的左上角Y坐标(逻辑单位)  
       int nDestWidth,     //目标矩形的宽度(就是设定贴过去的图片的宽度)  
       int nDestHeight,    //目标矩形的高度(就是设定铁锅的图片的高度)  
       int xSrc,            //源矩形的左上角X坐标  
       int ySrc,            //源矩形的左上角Y坐标  
       int nSrcWidth,      //源矩形的宽度  
       int nSrcHeight      //源矩形的高度  
    ) const throw( );  
      
      
    BOOL Draw(  
       HDC hDestDC,       //目标环境DC的句柄  
       const RECT& rectDest,        //一个RECT结构的引用,用来确定目标图像。  
       const RECT& rectSrc         //一个RECT结构体的引用,用来确定源图像  
    ) const throw( );  
      
      
    BOOL Draw(  
       HDC hDestDC,         //目标环境DC的句柄  
       int xDest,        //目标矩形的左上角X坐标  
       int yDest         //目标矩形的左上角Y坐标  
    ) const throw( );        //  
    BOOL Draw(  
       HDC hDestDC,        //目标环境DC的句柄  
       const POINT& pointDest         //一个POINT结构体,用来确定目的矩形的左上角坐标  
    ) const throw( );  
      
      
    BOOL Draw(  
       HDC hDestDC,        //目标环境DC的句柄  
       int xDest,        //目标矩形的左上角X坐标  
       int yDest,        //目标矩形的左上角Y坐标  
       int nDestWidth,        //目标矩形的宽度  
       int nDestHeight         //目标矩形的宽度  
    ) const throw( );  
      
      
    BOOL Draw(  
       HDC hDestDC,        //目标环境DC的句柄  
       const RECT& rectDest         //一个RECT结构的引用,用来确定目标图像。  
    ) const throw( );  
实际上我测试的是Draw绘制出来的图透明底色 仍然会以白色显示。(应该是还有其他的地方没有处理好,好像是与windows版本有关)

透明的实现函数是下边这个


Transparentblt主要的实现代码
BOOL TransparentBlt(
 HDC hDestDC,
 int xDest,
 int yDest,
 int nDestWidth,
 int nDestHeight,
 UINT crTransparent = CLR_INVALID) const throw();  
//crTransparent中的源位图被视为透明的颜色。 默认情况下, CLR_INVALID,指示应使用当前设置为图像的透明颜色的颜色。

 BOOL TransparentBlt(
 HDC hDestDC,
 const RECT& rectDest,
 UINT crTransparent = CLR_INVALID) const throw();

BOOL TransparentBlt(
 HDC hDestDC,
 int xDest,
 int yDest,
 int nDestWidth,
 int nDestHeight,
 int xSrc,
 int ySrc,
 int nSrcWidth,
 int nSrcHeight,
 UINT crTransparent = CLR_INVALID) const throw();

BOOL TransparentBlt(
 HDC hDestDC,
 const RECT& rectDest,
 const RECT& rectSrc,
 UINT crTransparent = CLR_INVALID) const throw();


加载函数

...
hdc bgdc,hdc;    
HITBMP bgbmp;
bgbmp = (HBITMAP)LoadImage(NULL, "background.bmp", IMAGE_BITMAP, 961, 600, LR_LOADFROMFILE);

SelectObject(bufdc, this->bgbmp); //加载bmp位图


CImage imagetest;
  imagetest.Load("bullet1.png"); //加载贴图
...

————————————————————————————————

绘图函数

void Game::Paint()  
{
        ....
	BitBlt(hdc, 0, 0, 941, 600, bufdc, 0, 0, SRCCOPY);  //绘制背景
	imagetest.TransparentBlt(hdc, 0, 0, imagetest.GetWidth(), imagetest.GetHeight(), RGB(255, 255, 255));//绘制透明贴图
	...
	
}
——————————————————————————————————


背景图是通过Bitblt绘制的bmp图像

贴图是使用TransparentBlt 而非Draw 绘制的(Draw 透明色仍然是白色)

比较方便简单,通过Cimage实现了png透明贴图的绘制:)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值