画透明位图通常的方法是使用遮罩。所谓遮罩就是一张黑白双色的位图,他和要透明的位图是对应的,遮罩描述了位图中需要透明的部分,透明的部分是黑色的,而不透明的是白色的,白色的部分就是透明的部分。
假设图A是要画的透明位图,图B是遮罩,图A上是一个大写字母A,字母是红色的,背景是黑色的,图B背景是白色的,上面有一个黑色的字母A和图A的形状是一样的。比如我们要在一张蓝天白云的背景上透明地画图A,就是只把红色的字母A画上去。我们可以先将图B和背景进行与操作,再把图B和背景进行或操作就可以了。
用VC++ MFC实现的代码如下:
void CDemoDlg::OnPaint()
{
   CPaintDC dc(this);
   Cbitmap BmpBack,BmpA,BmpB,*pOldBack,*pOldA,*pOldB;
   BmpBack.LoadBitmap(IDB_BACKGROUND); // 载入背景图
   BmpA.LoadBitmap(IDB_BITMAPA); //载入图A
   BmpB.LoadBitmap(IDB_BITMAPB); //载入图B
   CDC dcBack,dcA,dcB; //声明三个内存DC用于画图
   dcBack.CreateCompatibleDC(&dc);
   dcA.CreateCompatibleDC(&dc);
   dcB.CreateCompatibleDC(&dc); //把这三个内存DC创建成和PaintDC兼容的DC
   pOldBack=dcBack.SelectObject(&BmpBack);
   pOldA=dcA.SelectObject(&BmpA);
   pOldB=dcB.SelectObject(&BmpB); //把三个位图选入相应的DC
   dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY); //画背景
   dc.BitBlt(0,0,48,48,&dcB,0,0,SRCAND); //用与的方式画遮罩图B
   dc.BitBlt(0,0,48,48,&dcA,0,0,SRCPAINT); //用或的方式画遮图A
   dcBack.SelectObject(pOldBack);
   dcBack.SelectObject(pOldA);
   dcBack.SelectObject(pOldB); //从内存DC中删除位图
}
你会看到红色的字母A透明地画在背景上了。用遮罩的方法必须事先做好遮罩,遮罩和位图大小一样等于多消耗一倍的资源,比较浪费。还有一种画透明位图的方法,基本原理是一样的,只是不用事先做好遮罩,根据需要动态生成遮罩,但是要求需要透明的位图必须指定一种透明色,凡是这个透明色的地方则画成透明的。
用VC++ MFC实现的代码如下,这是一个用来画透明位图的函数:
CDC *pDC 需要画位图的CDC指针,
UINT IDImage 位图资源ID,
Crect &rect 指定位图在pDC中的位置,
COLORREF rgbMask 位图的透明色
void DrawTransparentBitmap(CDC *pDC, UINT IDImage,Crect &rect, COLORREF rgbMask)
{
   CDC ImageDC,MaskDC;
   Cbitmap Image,*pOldImage;
   Cbitmap maskBitmap,*pOldMaskDCBitmap ;
   Image.LoadBitmap(IDImage);
   ImageDC.CreateCompatibleDC(pDC);
   pOldImage=ImageDC.SelectObject(&Image);
   MaskDC.CreateCompatibleDC(pDC);
   maskBitmap.CreateBitmap( rect.Width(), rect.Height(), 1, 1, NULL );
   pOldMaskDCBitmap = MaskDC.SelectObject( &maskBitmap );
   ImageDC.SetBkColor(rgbMask);
   MaskDC.BitBlt( 0, 0, rect.Width(), rect.Height(), &ImageDC, 0, 0, SRCCOPY );
   ImageDC.SetBkColor(RGB(0,0,0));
   ImageDC.SetTextColor(RGB(255,255,255));
   ImageDC.BitBlt(0, 0, rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
   pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
   pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &ImageDC, 0, 0,SRCPAINT);
   MaskDC.SelectObject(pOldMaskDCBitmap);
   ImageDC.SelectObject(pOldImage);
}
void CDemoDlg::OnPaint()
{
   CPaintDC dc(this);
   Cbitmap BmpBack,*pOldBack,;
   BmpBack.LoadBitmap(IDB_BACKGROUND);
   CDC dcBack;
   dcBack.CreateCompatibleDC(&dc);
   pOldBack=dcBack.SelectObject(&BmpBack);
   dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY);
   DrawTransparentBitmap(&dc,IDB_BITMAPA,Crect(0,0,48,48),RGB(192,192,0));
   dcBack.SelectObject(pOldBack);
}

转载于:https://www.cnblogs.com/mugua/archive/2009/07/02/1515209.html

如何画透明位图(转)相关推荐

  1. BitBlt 画透明位图

    CDC::BitBlt函数,应用在GDI的绘图中,有时候我们需要显示的位图有一部分是透明的,例如在棋类游戏中,棋盘图片和棋子图片融合的时候,棋子边缘应该是透明. 在图1中,棋盘和棋子图片融合在一起,需 ...

  2. 透明位图Ron Gery Microsoft 网络开发技术小组

    摘要 这篇文章讨论了在 Microsoft Windows 图形环境中用位图达到透明和屏蔽效果的几种方法,包括通过仿真和使用特殊的驱动器功能.包含其中的一个小样本应用程序 TRANSBLT 详细阐明了 ...

  3. 透明位图的显示(TransparentBlt函数)

    包含透明色的位图的绘制方法有多种,最简单的方法是调用现成的函数:TransparentBlt,也可以通过自己的代码实现类似TransparentBlt的功能,实现过程也有两种形式,一种是事先做一张掩码 ...

  4. vc实现透明位图,透明背景

    vc实现透明位图,透明背景 我们在进行程序的界面设计时,常常希望将位图的关键部分,也既是图像的前景显示在界面上,而将位图的背景隐藏起来,将位图与界面很自然的融合在一起,本文介绍了透明位图的制作知识,并 ...

  5. 使用StretchBlt函数实现绘制透明位图

    背景 在自己本科的时候,喜欢用 VC6.0 写一些小游戏来锻炼自己的编程水平.那些小游戏的游戏画面绘制都是使用Windows提供的GDI(图形设备接口)函数实现的,并没有调用现成的游戏引擎.所以,使得 ...

  6. C语言TransparentBlt函数,技术分享 - 使用TransparentBlt函数实现绘制透明位图

    背景 在自己本科的时候,喜欢用 VC6.0 写一些小游戏来锻炼自己的编程水平.那些小游戏的游戏画面绘制都是使用Windows提供的GDI(图形设备接口)函数实现的,并没有调用现成的游戏引擎.所以,使得 ...

  7. TransparentBlt 透明位图的显示

    from :  http://www.cnblogs.com/syxchina/archive/2010/06/01/2197688.html 包含透明色的位图的绘制方法有多种,最简单的方法是调用现成 ...

  8. 使用TransparentBlt函数实现绘制透明位图

    背景 在自己本科的时候,喜欢用 VC6.0 写一些小游戏来锻炼自己的编程水平.那些小游戏的游戏画面绘制都是使用Windows提供的GDI(图形设备接口)函数实现的,并没有调用现成的游戏引擎.所以,使得 ...

  9. [源码和文档分享]使用TransparentBlt函数实现绘制透明位图

    背景 在自己本科的时候,喜欢用 VC6.0 写一些小游戏来锻炼自己的编程水平.那些小游戏的游戏画面绘制都是使用Windows提供的GDI(图形设备接口)函数实现的,并没有调用现成的游戏引擎.所以,使得 ...

最新文章

  1. 机器学习(15)精确率召回率F1-score(查看癌症预测结果的精确率、召回率)
  2. Brute Force STL --- UVA 146 ID Codes
  3. TCP协议的粘包问题(数据的无边界性)
  4. Andriod: 在xml布局中使用自定义属性
  5. 微信小程序设置启动图时出现滚动条
  6. 如何在Java中使用重复项查找整数数组中的K个缺失数字?
  7. 工作33:page值不能修改
  8. HTML+CSS+JS实现 ❤️透明的水滴文字背景特效❤️
  9. 三角学——极坐标_2
  10. [转载] Python日历模块| 使用示例的weekday()方法
  11. matlab对有周期性噪声的图像去噪,数字图像中去除周期性噪声研究.doc
  12. ubuntu服务器+apache2绑定域名(以腾讯云域名为例)
  13. 一点创业想法:读书类垂直博客
  14. Solr搜索引擎——中文分词器
  15. SaltStack 拉取和推送文件
  16. mysql 5.6.14 win7 32位免安装版配置_mysql 5.6.14 win7 32位免安装版配置
  17. 省市区三级行政区划数据JS插件
  18. pytorch ——torch.optim.Adam
  19. 【数据库】解剖式学习无损分解
  20. 把ip导入mysql_纯真IP数据库导入mysql

热门文章

  1. 第二章:2.4 卷积性质
  2. 基于 Ubuntu 系统安装 CUDA 和 cuDNN
  3. 游戏设计模式——C++单例类
  4. 在内核中添加系统调用
  5. 封装对MongoDB数据库的增删改查访问方法(基于MongoDB官方发布的C#驱动)
  6. C语言中的static 详细分析 2014-10-11 15:15 143人阅读 评论(0) 收藏...
  7. 关于notepad++中ZenCoding插件失灵的原因
  8. UA OPTI544 量子光学7 补充:Density Operator
  9. UA OPTI512R 傅立叶光学导论16 Nyquist-Shannon采样定理
  10. UA MATH571B 试验设计 2k析因设计理论下