如何让位图显示为透明?

[复制链接]
4591|15
 楼主| huhu2009 发表于 2010-4-10 08:55 | 显示全部楼层 |阅读模式
本帖最后由 huhu2009 于 2010-4-10 08:59 编辑

不用uc/Gui里的memdev,读位图,将像素直接逐个显示在屏幕上,如何才能让位图显示为透明呢?

如:下面位图,电话那个弧形是白色,然后是绿色,周围有个白色的边框,现在窗口背景为黑色,则需使这个白色边框呈现为黑色才算“透明”,但电话的白色却不能画成黑色。怎么做呢,请高手指点。
call.JPG
 楼主| huhu2009 发表于 2010-4-11 20:28 | 显示全部楼层
没有人知道么……即使撇开uc/Gui不管,谈谈思路也行啊
秋天落叶 发表于 2010-4-11 21:01 | 显示全部楼层
没做过这方面的,不过很有兴趣,帮顶一下,期待高手
香水城 发表于 2010-4-12 09:43 | 显示全部楼层
不要把透明色定义为白色即可。
yuyixuanta 发表于 2010-4-12 12:18 | 显示全部楼层
你这种需要做一个掩码图,自己搜一下这个关键词,很容易的。
stmsky 发表于 2010-4-12 18:34 | 显示全部楼层
 楼主| huhu2009 发表于 2010-4-19 21:45 | 显示全部楼层
是6楼的那个效果,你特意做了处理、还是只把背景色设置为白色?如果是后者的话,换个背景就能看得出来了
 楼主| huhu2009 发表于 2010-4-19 21:47 | 显示全部楼层
5# yuyixuanta 如果做掩码图的话,就又多出一个图片来,需要更多的空间来存放它们
 楼主| huhu2009 发表于 2010-4-19 21:48 | 显示全部楼层
4# 香水城 不太明白……
kiton_law 发表于 2010-4-20 21:35 | 显示全部楼层
本帖最后由 kiton_law 于 2010-4-20 21:38 编辑

一般有三种方式
1.通过三元光栅操作,先做一个掩码位图,对应图片需要显示的部分填充为全0(颜色是几位就填几位),对应图片透明部分填充为全1,图片中需要透明的部位填充为全0,先用掩码图和目标表面AND,然后用图片和目标表面OR
2.通过透明色表面过滤,透明表面是个单一颜色的图片,你要显示的图片的透明部分颜色应该和透明表面相同,先将透明色表面和目标表面XOR,再将图片与目标XOR,图片中与透明色表面同色的部分将会透明
3.通过透明色判断,设置透明色,在用图片填充目标表面时,判断图片象素是否和透明值相同,如果相同就不填充

1方法需要额外的和图片一样大的存储空间来存储掩码,并且每幅图片都需要一个掩码图,但是图片不透明的部分可以使用任何颜色,老式显示设备常用(因为一般不支持硬件透明表面)

2方法需要的空间稍小,一个透明表面可以用于过滤所有使用相同透明色的图片,但限制就是你所有用该表面过滤的图片都要使用相同的透明色,而且图片显示区域内将不能使用透明色,但这个不是大问题。在有硬件加速的图形处理器中,这种方法常用,它们一般都有一个硬件的过滤表面(你只需要设置表面的颜色值)
前两种方法都需要在读取目标表面象素值上有速度优势,否则就是出力不讨好。

3方法需要空间最小,并且无需提取目标表面的值(判断图片象素是否为透明值时是不需要目标数据的),适合空间小并且读取目标表面不便的情况下(比如使用MCU控制通过端口操作显存的LCD),但速度最慢,而且图片的显示部分也不能用透明色。

这几种方法各有优势,看具体硬件情况选择。
当然还有其他方式,但无非就是光栅操作的顺序和模式不同。
但在MCU的应用中方法3无疑最有前途,因为速度要求不高,而且资源有限,我都是使用第3种方法的,1方法和2方法一般在高级的图形引擎中才使用。
xwj 发表于 2010-4-20 22:37 | 显示全部楼层
LS讲得很好,Windows很多年前开始就是将粉红色作为视频透明色的,只要是这个颜色,就直接显示动态视频部分。
kiton_law 发表于 2010-4-21 09:53 | 显示全部楼层
其实还有一种方法,就是做alpha混合,不但可以实现透明,还能实现半透明,但是。。。。如果没有硬件支持的话还是算了吧
IJK 发表于 2010-4-21 10:18 | 显示全部楼层
谢谢,学习了
llf021421 发表于 2010-10-27 20:09 | 显示全部楼层
谢谢,学习了!
pkat 发表于 2010-10-27 22:43 | 显示全部楼层
分析的很透彻
STARM 发表于 2010-10-28 09:07 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

163

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部