背景

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

其中,那些小游戏都会用到的一个关键技术,便是透明位图的绘制。现在,我把之前自己开发小游戏时,绘制透明位图的方法总结一下,分别为大家介绍一下三种实现方法:一是使用 BitBlt 函数实现;二是使用 StretchBlt 函数实现;三是使用 TransparentBlt 函数实现。

这三种方法,分别为其写一遍文档进行介绍,本文介绍的是 TransparentBlt 函数实现透明位图的绘制。

函数介绍

TransparentBlt 函数对指定的源设备环境中的矩形区域像素的颜色数据进行位块(bit_block)转换,并将结果置于目标设备环境。

函数声明

BOOLTransparentBlt(

HDC hdcDest,

intnXOriginDest,

intnYOriginDest,

intnWidthDest,

inthHeightDest,

HDC hdcSrc,

intnXOriginSrc,

intnYOriginSrc,

intnWidthSrc,

intnHeightSrc,

UINT crTransparent

);

参数

hdcDest:指定目标的句柄。

nXOriginDest:指定目标矩形左上角的X轴坐标,坐标以逻辑单位表示。

nYOriginDest:指定目标矩形左上角的Y轴坐标,坐标以逻辑单位表示。

nnWidthDest:指定目标矩形的宽度。

nHeightDest:指定目标矩形的高度。

hdcSrc:源图的句柄。

nXOriginSrc:指定源矩形(左上角)的X轴坐标,坐标以逻辑单位表示。

nYOriginsrc:指定源矩形(左上角)的Y轴坐标,坐标以逻辑单位表示。

nWidthSrc:指定源矩形的宽度。

nHeightSrc:指定源矩形的高度。

crTransparent:源位图中的RGB值当作透明颜色。(用RGB(0,0,0)也就是黑色不行)。

返回值

如果函数成功,那么返回TRUE;如果函数失败,则返回FALSE。

什么是位图透明处理?

至于如何使用 BitBlt 函数绘制位图,我在《BMP位图的绘制》这篇有讲过,当然这只是其中一种绘图方法而已,并不是唯一的。

那我就先来介绍下,什么是透明位图的绘制。用下面的图片直观表示吧:

如果我们有两张图片,一张是背景图:

一张是人物图:

现在,我想把人物绘制到背景图上,那么按照通常的方法就是,把人物的图片直接在背景图上显示就好,效果如下所示:

大家可能会看到有些问题了吧,我们其实想要的是下面这张图片的效果:

没错,所谓的透明位图的绘制就像上面图片表示出来的那样。就是我们只绘制图片特定的地方,而且形状都是不规则的,其他的不进行绘制。就对上上面的例子来说,就是把人物抠出来绘制,背景的蓝色不绘制,即背景像似透明一样,所以这便是位图的透明绘制。

编程实现原理

对于,TransparentBlt 函数来说,它的最后一个参数指定除黑色RGB(0, 0, 0)外的其它透明颜色。所谓的透明颜色是指,只要是指定RGB值的颜色,使用Transparent函数都不会绘制,只绘制其他非指定透明颜色RGB值的颜色。

对于上面的例子来说,我们只要指定透明颜色RGB为蓝色(0, 0, 255),这样,就可以不绘制蓝色,而只绘制非蓝色部分的人物图像了。

对于,为何指定了透明颜色,就可以实现透明处理,其本质的原理可以参考我写的《使用BitBlt函数实现绘制透明位图》和《使用StretchBlt函数实现绘制透明位图》这两篇文章中的透明原理的分析。Transparent 函数的实现,应该是调用 StretchBlt 函数去实现的。

编码实现

导入库文件#include

#pragmacomment(lib,"Msimg32.lib")

绘制背景位图BOOLPaintBmp(HWND hWnd)

{

// 获取窗口的客户区域的显示设备上下文环境的句柄

HDC hDC=::GetDC(hWnd);

// 创建一个与hDC兼容的内存设备上下文环境

HDC hBuf=::CreateCompatibleDC(hDC);

// 加载位图, 获取位图句柄

HBITMAP hBmp=(HBITMAP)::LoadImage(NULL,"image\\bg.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

// 选择位图句柄到hBuf中, 并获取返回的原来位图句柄

HBITMAP hOldBmp=(HBITMAP)::SelectObject(hBuf,hBmp);

// 绘图

::BitBlt(hDC,0,0,764,397,hBuf,0,0,SRCCOPY);

// 还原位图对象

::SelectObject(hBuf,hOldBmp);

// 释放位图

::DeleteObject(hBmp);

// 释放兼容的内存设备上下文环境

::DeleteDC(hBuf);

// 释放设备上下文环境

::ReleaseDC(hWnd,hDC);

returnTRUE;

}

绘制透明位图BOOLPaintTransparentBmp(HWND hWnd)

{

// 获取窗口的客户区域的显示设备上下文环境的句柄

HDC hDC=::GetDC(hWnd);

// 创建一个与hDC兼容的内存设备上下文环境

HDC hBuf=::CreateCompatibleDC(hDC);

// 加载位图, 获取位图句柄

HBITMAP hBmp=(HBITMAP)::LoadImage(NULL,"image\\1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

// 选择位图句柄到hBuf中, 并获取返回的原来位图句柄

HBITMAP hOldBmp=(HBITMAP)::SelectObject(hBuf,hBmp);

// 透明色为蓝色 绘制

::TransparentBlt(hDC,280,210,200,200,hBuf,0,0,101,121,RGB(0,0,255));

// 还原位图对象

::SelectObject(hBuf,hOldBmp);

// 释放位图

::DeleteObject(hBmp);

// 释放兼容的内存设备上下文环境

::DeleteDC(hBuf);

// 释放设备上下文环境

::ReleaseDC(hWnd,hDC);

returnTRUE;

}

程序测试

调用上述封装好的函数,直接测试。人物位图成功背景透明绘制到背景图上。而且,人物还能成功拉伸绘制。

总结

使用 TransparentBlt 函数实现透明位图处理,应该是这三种实现方法中最为简单,也是最容易理解的。而且,使用起来还比较简洁灵活。

C语言TransparentBlt函数,技术分享 - 使用TransparentBlt函数实现绘制透明位图相关推荐

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

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

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

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

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

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

  4. Excel 函数功能分享之Find 函数

    提到查找函数,在Excel中主要有两个不同的函数: Find 函数 Search 函数 这两个函数其实在Excel中没有太大的差别,唯一的差别在于​Find 函数区分大小写,而Search 不区分大小 ...

  5. 【华为云技术分享】Linux内核模块依赖图绘制(2)

    在上一期中,我们介绍了如何查看Linux内核中各个模块之间的依赖关系,这一期我们将介绍一下根据模块的依赖关系如何绘制模块依赖图. 一.使用freemind绘制模块依赖图 Freemind是一款常用的思 ...

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

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

  7. TransparentBlt 透明位图的显示

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

  8. 打豆豆游戏c语言编程,C语言程序打豆豆(函数版)分享!

    [项目] 设计一个程序,能重复地在显示下面的信息: 根据用户输入的选项,输出一句提示性的话语(将来会对应实现某个功能).输入0,则退出. 要求将各功能定义专门的函数. 参考解答: #include # ...

  9. hive中字段长度函数_技术分享:hive常用内部函数

    原标题:技术分享:hive常用内部函数 hive常用内部函数 hive是一种典型的数据仓库分析工具,常用语编写hql语句进行指标分析.在编写hql的过程中无疑会用到很多的函数,哪本章来编写一些常见的函 ...

最新文章

  1. 【智驾深谈】Mobileye,用单目视觉点亮自动驾驶
  2. POJ3277 线段树段更新,点询问+二分离散化+暴力
  3. distributed representations的意义
  4. python如何小写p转换p_Python如何将字符串“p”从列表转换为变量值p
  5. 字典与集合_月隐学python第8课
  6. python 消息队列 get是从队首还是队尾取东西_python分布式爬虫中消息队列知识点详解...
  7. c语言 define 关键字,c语言中define的一个不常见的用法
  8. python中字典的常用操作命令及注意事项
  9. dotNet中初始化器的使用
  10. 屠呦呦入选《时代周刊》100位最具影响力女性人物榜
  11. php多级控制,thinkphp5多级控制器是什么?怎么使用?
  12. [Ext JS]Grid的列过滤
  13. 我弟弟用管理员身份把我和爸妈的WIFI设置了,现在就他能用网,气不过,有办法让我出口气吗?
  14. Android Content Provider基础
  15. word把对应图片变成嵌入的ActiveX控件。
  16. EL表达式用法---查询博客
  17. c#使用正则表达式获取TR中的多个TD_Linux之正则表达式
  18. 第1章 Pandas基础操作(使用pandas进行数据分析,从小白逆袭大神,你会了吗?)
  19. win7配置maven环境变量
  20. 新手问题:如何理解sql语句中 +textBox1.Text+

热门文章

  1. react-Props与State
  2. 核酸提取干货 - MedChemExpress
  3. 从基础讲全排列(Java实现)
  4. 集合遍历python_遍历Python中的集合
  5. 浏览器兼容模式打不开网页,极速模式可以的解决方法
  6. word2007 用高版本打开格式混乱
  7. 巧用UserAgent来解决浏览器的各种问题
  8. 摩拜推AI平台"魔方" 300万辆单车背后谁在调度?
  9. html表单window.onload,html事件绑定总结以及window.onload和document.body.onload事件
  10. css div 选项卡效果