游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1735|回复: 1

显示透明位图的问题 C++

[复制链接]

3

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
QQ
发表于 2009-11-9 21:48:00 | 显示全部楼层 |阅读模式
如下一段文件是来自:
http://www.vckbase.com/document/viewdoc/?id=532
关于透明位置的显示——王骏




实现TransparentBlt函数
为了理解具有透明色位图的绘制过程,我们来亲手建立一个具有同TransparentBlt功能一致的实验函数,称之为TransparentBlt2。

实验素材:有两张位图:bk.bmp是背景位图,football.bmp包含透明区域,透明色为蓝色RGB(0,0,0xff)
实验目的:以bk.bmp为背景,将football.bmp绘制到背景中,形成如下的最终效果图。


2.1 透明位图绘制原理
假设football.bmp ->载入 HBITMAP hImageBMP -> 选入 HDC hImageDC

2.1.1 生成足球的单色掩码位图,透明区域为白色(全1),非透明区域为黑色(全0)

HBITMAP hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 建立单色位图
SetBkColor(hImageDC, RGB(0,0,0xff)); // 设置背景色为蓝色
BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY); // 拷贝到hMaskDC

这样足球位图中蓝色区域在掩码位图中成了白色,其它区域为黑色,此时hMaskBMP 如下图:
(图一)


2.1.2 设置背景色为黑色,前景色为白色,将掩码位图(图一)与足球位图相"与"

SetBkColor(hImageDC, RGB(0,0,0));---------------------------------------------①
SetTextColor(hImageDC, RGB(255,255,255));-------------------------------------②
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);-------③

这样,掩码位图中背景色(黑色)的区域在hImageBMP中被保留,前景色(白色)的部分变为黑色。 此时hImageBMP 如下图:
(图二)


2.1.3 设置背景色为白色,前景色为黑色,将掩码位图(图一)与背景进行“与”运算
SetBkColor(hdcDest,RGB(255,255,255));-----------------------------------------④
SetTextColor(hdcDest,RGB(0,0,0));---------------------------------------------⑤
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);-------⑥

掩码中白色区域(数据与1相“与”结果不变)使背景保持不变,黑色区域变成黑色,此时背景显示如下:
(图三)


2.1.4 将hImageBMP(图二)与背景(图三)进行“或”运算

BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);-----⑦

这样就将足球绘制到背景上了。


问题1:如上所说,在到第 2.1.2 步时,hMaskDC 代表的图片为图一(黑色部分为 0 ,白色部分为 1 )
按理说,执行 AND 操作,遇 0 还是 0 ,那么经过 ③ 后,hImageDC 中间的球形
不也应该是黑色( 0 )的吗,周围应当保留蓝色。
为什么实际的图二与我的预计相反呢?
我发现我把 ①② 释掉,结果才与我预计的相同。为什么 ①② 会产生这样的影响,
①② 字面上意思我懂,可它们这样设置,对 ③ 到底是怎样影响的?

问题2:hImageDC 是彩色位图,hMaskDC 是单色位图, ③ 语句 是单色 AND 彩色,⑥ 是彩色 AND 单色,这两种情况受
SetBkColor(),SetTextColor()的影响一样吗?

本人在这里困了很久了,望好心人帮助,感激不尽(讲得越简单越好^_^)...

4

主题

33

帖子

33

积分

注册会员

Rank: 2

积分
33
发表于 2009-11-10 00:59:00 | 显示全部楼层

Re:显示透明位图的问题 C++

用的是蒙板技术,蓝色为透明区,用白色(全1)与其(就是蓝色透明部分)相或,透明区生成的为全1的白色,非透明区用黑色(全0)与其(就是足球部分)相与生成的为全0的黑色,这样就生成了蒙板图(图1)。同理生成图2.然后拿图1和背景图相与,最后拿图2与背景图相或。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-18 05:21

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表