C语言TransparentBlt函数,技术分享 - 使用TransparentBlt函数实现绘制透明位图
背景
在自己本科的时候,喜欢用 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函数实现绘制透明位图相关推荐
- [源码和文档分享]使用TransparentBlt函数实现绘制透明位图
背景 在自己本科的时候,喜欢用 VC6.0 写一些小游戏来锻炼自己的编程水平.那些小游戏的游戏画面绘制都是使用Windows提供的GDI(图形设备接口)函数实现的,并没有调用现成的游戏引擎.所以,使得 ...
- 使用TransparentBlt函数实现绘制透明位图
背景 在自己本科的时候,喜欢用 VC6.0 写一些小游戏来锻炼自己的编程水平.那些小游戏的游戏画面绘制都是使用Windows提供的GDI(图形设备接口)函数实现的,并没有调用现成的游戏引擎.所以,使得 ...
- 使用StretchBlt函数实现绘制透明位图
背景 在自己本科的时候,喜欢用 VC6.0 写一些小游戏来锻炼自己的编程水平.那些小游戏的游戏画面绘制都是使用Windows提供的GDI(图形设备接口)函数实现的,并没有调用现成的游戏引擎.所以,使得 ...
- Excel 函数功能分享之Find 函数
提到查找函数,在Excel中主要有两个不同的函数: Find 函数 Search 函数 这两个函数其实在Excel中没有太大的差别,唯一的差别在于Find 函数区分大小写,而Search 不区分大小 ...
- 【华为云技术分享】Linux内核模块依赖图绘制(2)
在上一期中,我们介绍了如何查看Linux内核中各个模块之间的依赖关系,这一期我们将介绍一下根据模块的依赖关系如何绘制模块依赖图. 一.使用freemind绘制模块依赖图 Freemind是一款常用的思 ...
- 透明位图的显示(TransparentBlt函数)
包含透明色的位图的绘制方法有多种,最简单的方法是调用现成的函数:TransparentBlt,也可以通过自己的代码实现类似TransparentBlt的功能,实现过程也有两种形式,一种是事先做一张掩码 ...
- TransparentBlt 透明位图的显示
from : http://www.cnblogs.com/syxchina/archive/2010/06/01/2197688.html 包含透明色的位图的绘制方法有多种,最简单的方法是调用现成 ...
- 打豆豆游戏c语言编程,C语言程序打豆豆(函数版)分享!
[项目] 设计一个程序,能重复地在显示下面的信息: 根据用户输入的选项,输出一句提示性的话语(将来会对应实现某个功能).输入0,则退出. 要求将各功能定义专门的函数. 参考解答: #include # ...
- hive中字段长度函数_技术分享:hive常用内部函数
原标题:技术分享:hive常用内部函数 hive常用内部函数 hive是一种典型的数据仓库分析工具,常用语编写hql语句进行指标分析.在编写hql的过程中无疑会用到很多的函数,哪本章来编写一些常见的函 ...
最新文章
- 【智驾深谈】Mobileye,用单目视觉点亮自动驾驶
- POJ3277 线段树段更新,点询问+二分离散化+暴力
- distributed representations的意义
- python如何小写p转换p_Python如何将字符串“p”从列表转换为变量值p
- 字典与集合_月隐学python第8课
- python 消息队列 get是从队首还是队尾取东西_python分布式爬虫中消息队列知识点详解...
- c语言 define 关键字,c语言中define的一个不常见的用法
- python中字典的常用操作命令及注意事项
- dotNet中初始化器的使用
- 屠呦呦入选《时代周刊》100位最具影响力女性人物榜
- php多级控制,thinkphp5多级控制器是什么?怎么使用?
- [Ext JS]Grid的列过滤
- 我弟弟用管理员身份把我和爸妈的WIFI设置了,现在就他能用网,气不过,有办法让我出口气吗?
- Android Content Provider基础
- word把对应图片变成嵌入的ActiveX控件。
- EL表达式用法---查询博客
- c#使用正则表达式获取TR中的多个TD_Linux之正则表达式
- 第1章 Pandas基础操作(使用pandas进行数据分析,从小白逆袭大神,你会了吗?)
- win7配置maven环境变量
- 新手问题:如何理解sql语句中 +textBox1.Text+
热门文章
- react-Props与State
- 核酸提取干货 - MedChemExpress
- 从基础讲全排列(Java实现)
- 集合遍历python_遍历Python中的集合
- 浏览器兼容模式打不开网页,极速模式可以的解决方法
- word2007 用高版本打开格式混乱
- 巧用UserAgent来解决浏览器的各种问题
- 摩拜推AI平台"魔方" 300万辆单车背后谁在调度?
- html表单window.onload,html事件绑定总结以及window.onload和document.body.onload事件
- css div 选项卡效果