QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2984|回复: 6

透明原理

[复制链接]
发表于 2006-5-19 15:21:30 | 显示全部楼层 |阅读模式
转载:

画透明位图通常的方法是使用遮罩。所谓遮罩就是一张黑白双色的位图,他和要透明的位图是对应的,遮罩描述了位图中需要透明的部分,透明的部分是黑色的,而不透明的是白色的,白色的部分就是透明的部分。

假设图A是要画的透明位图,图B是遮罩,图A上是一个大写字母A,字母是红色的,背景是黑色的,图B背景是白色的,上面有一个黑色的字母A和图A的形状是一样的。

比如我们要在一张蓝天白云的背景上透明地画图A,就是只把红色的字母A画上去。我们可以先将图B和背景进行与操作,再把图B和背景进行或操作就可以了。

----------------------------------------
Note:我还没有试过.asmcos
发表于 2006-5-21 02:16:56 | 显示全部楼层
这是区域画图吧,我的透明度转换(RGBA):
[code:1]
        inline e_rgb_color& mix(euint8 r, euint8 g, euint8 b, euint8 a)
        {
                if(a == 255)
                {
                        red = r; green = g; blue = b;
                }
                else if(a != 0)
                {
                        euint32 _r = min_c(255, ((euint32)red * (255 - (euint32)a) + (euint32)r * (euint32)a) / 255);
                        euint32 _g = min_c(255, ((euint32)green * (255 - (euint32)a) + (euint32)g * (euint32)a) / 255);
                        euint32 _b = min_c(255, ((euint32)blue * (255 - (euint32)a) + (euint32)b * (euint32)a) / 255);
                        red = (euint8)_r; green = (euint8)_g; blue = (euint8)_b;
                }

                return *this;
        }
[/code:1]

解释(RGB):
目标对应颜色分量=本身对应颜色分量X(1-目标透明度)+绘图对应颜色分量X目标透明度
回复

使用道具 举报

 楼主| 发表于 2006-5-23 14:28:50 | 显示全部楼层
你这里的r,g,b
red,green,blue
分别代表什么?

你能将你的图形上的透明效果图拿出来看看吗?
回复

使用道具 举报

 楼主| 发表于 2006-5-25 09:51:07 | 显示全部楼层
EGui透明实现 参考的AnthonyLee代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

 楼主| 发表于 2006-5-26 16:34:30 | 显示全部楼层
http://www.libpng.org/pub/png/book/chapter13.html
http://www.libpng.org/pub/png/book/sources.html

http://prdownloads.sourceforge.net/png-mng/pngbook-20010630-src.tar.gz?download
回复

使用道具 举报

发表于 2006-5-30 22:53:03 | 显示全部楼层
上述代码是基本思路,至于如果要求更快的话,可能利用位运算...
<<8 = *256
>>8 = /256
x / 255 = ?? (自己思考)

上面代码中其实没可能出现乘积大于 0xffff
所以可换为
[code:1]
        /********* from etk/interface/GraphicsDefs.h ***********/
        inline e_rgb_color& mix(euint8 r, euint8 g, euint8 b, euint8 a)
        {
                if(a == 255)
                {
                        red = r; green = g; blue = b;
                }
                else if(a != 0)
                {
                        red = (euint8)(((euint16)red * ((euint16)255U - (euint16)a) + (euint16)r * (euint16)a) / (euint16)255U);
                        green = (euint8)(((euint16)green * ((euint16)255U - (euint16)a) + (euint16)g * (euint16)a) / (euint16)255U);
                        blue = (euint8)(((euint16)blue * ((euint16)255U - (euint16)a) + (euint16)b * (euint16)a) / (euint16)255U);
                }

                return *this;
        }
[/code:1]
回复

使用道具 举报

 楼主| 发表于 2006-5-31 08:34:40 | 显示全部楼层
libpng中有现成的算法.呵呵!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 14:31 , Processed in 0.043443 second(s), 17 queries .

© 2021 Powered by Discuz! X3.5.

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