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

C语言TransparentBlt函数,技术分享 – 使用TransparentBlt函数实现绘制透明位图背景在自己本科的时候 喜欢用 VC6 0 写一些小游戏来锻炼自己的编程水平 那些小游戏的游戏画面绘制都是使用 Windows 提供的 GDI 图形设备接口 函数实现的 并没有调用现成的游戏引擎 所以 使得自己对 GDI 函数比较熟悉 能用它开发各式各样的小游戏 其中 那些小游戏都会用到的一个关键技术 便是透明位图的绘制 现在 我把之前自己开发小游戏时 绘制透明位图的方法总结一下 分别为大家介绍一下三种实现方

背景

在自己本科的时候,喜欢用 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位图的绘制》这篇有讲过,当然这只是其中一种绘图方法而已,并不是唯一的。

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

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

e2757a9543693ae5c851483a2dba5e5d.png

一张是人物图:

a3ec48e137f0fd67c79cb5c50c15a856.png

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

fc7722a8eb6de6104f8f2606a2a8c04e.png

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

318a99ab5d6f78cc4859e39aedbea9dc.png

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

编程实现原理

对于,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;

}

程序测试

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

7e24451f5de6b61981143340cb0c8ab5.png

总结

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226625.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午10:30
下一篇 2026年3月16日 下午10:30


相关推荐

  • 免费空间(免备案,无广告) 1G免费全能空间

    免费空间(免备案,无广告) 1G免费全能空间云邦互联免费空间(免备案,无广告)【1G免费全能空间,免备案,无广告】 1G全能空间+100M数据库(Mysql5.5/SQLServer2005) 支持的脚本:ASP、PHP(5.2-7.0)、.NET(2.0/4.0) 没有任何限制,详细功能请访问: https://www.yunzz.net/host/free.html(云邦互联) 推广

    2022年6月28日
    47
  • 【转载】序列化和反序列化

    【转载】序列化和反序列化

    2021年11月18日
    46
  • autossh安装和连接

    autossh安装和连接安装 autosshyumin yautossh 创建公钥和密钥 ssh keygen 密钥拷贝到跳转服务器 ssh copy id p15178root 148 70 111 203 自动检测脚本 bin shps fe grepautossh grep 148 70 111 203 grep vgrepif ne0 thenecho startprocess usr bin autossh p15178

    2026年3月19日
    2
  • TextWatcher学习[通俗易懂]

    xmlversion=”1.0″encoding=”utf-8″?>LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”android:orientation=”vertical”android:layout_width=”fill_parent”android:layout_heig

    2022年4月18日
    49
  • 如何学习单片机?单片机c语言编程入门教程

    如何学习单片机?单片机c语言编程入门教程我当初是自学单片机的 也用同样的方法带出过月入 15K 以上的徒弟 我的方法不能说是最好的 但绝对是靠谱的 毕竟都是曾经自己趟过的路 如果你还在纠结你的学历 纠结英语数学不好能不能学会的问题 今天我就给你吃的定心丸 别的行业不敢说 单片机 稳 学历 以及数学英语是决定你的天花板有多高 而不是门槛 Ok 下面干货开始 一 如何学习单片机 看了很多帖子 单片机要学的东西很多 既要懂硬件又要会编程之类的话 把很多人都吓尿在门外 其实这句话只对了一半 单片机确实是要懂硬件和编程 但很多人忽略了学习的

    2026年3月26日
    2
  • 200套web前端期末大作业 HTML+CSS+JavaScript网页设计实例 企业网站制作 [建议收藏]

    200套web前端期末大作业 HTML+CSS+JavaScript网页设计实例 企业网站制作 [建议收藏]一、更多HTML期末学生结课大作业作品❤200套HTML期末大作业网页设计作品1.HTML期末学生结课大作业~html+css+javascript仿叮当电影在线网站(功能齐全)2.HTML期末学生作业~html+css+javascript仿猫眼电影在线网站(功能齐全)3.HTML期末学生大作业(9套)html+css+javascript仿京东、天猫、服装、各大电商模板(大学毕业设计)4.HTML期末大作业~海贼王中乔巴专题漫画学生网页设置作业源码(HTML+CSS+JavaScript)5

    2026年2月23日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号