css3的rgba色彩模式、png/gif图片的alpha通道、canvas的rgba色彩模式、css3的阴影、css3的opacity属性等等,这些应用在网页中,有意无意间,我们的页面多了许多半透明的效果。我们知道,在没有alpha通道的情况下,两个颜色叠加,上层的颜色会直接覆盖下层的颜色,但有了alpha通道,一切就没有这么简单了。今天,我们就要探讨一下,网页中,rgba(r1, g1, b1, a1) + rgba(r2, g2, b2, a2)会得到什么。

为表述方便,不妨假设最后我们得到的色彩是rgba(r, g, b, a)。

先考虑透明度。一个色彩透明度opacity介于0到1之间,opacity=0表示完全透明,opacity=1表示不透明。把要叠加上来的色彩想象成一块玻璃,如果这块玻璃的透明度是0.2,意味着它允许透过80%的光线,阻挡20%的光线。

好,现在想象有两块玻璃,透明度分别是a1和a2,那么光线的通过率分别为1-a1和1-a2。所以可以认为,光线穿过第一块玻璃后,剩余1-a1;再通过第二块玻璃后,还有(1-a1)(1-a2),这就是两块玻璃的综合透光率,相应的,透明度就是1-(1-a1)(1-a2)。

所以我们能得到第一个结论:


,即接下来考虑rgb各分量,它们的计算方法是一样的,我们仅以r通道为例,进行推导。还是想象一块半透明的玻璃,它本身是红色的,但由于它允许其他光线透过,所以玻璃本身的颜色会变淡。人们实际感受到的颜色,只是玻璃原本的颜色乘以透明度的结果。

如果有两块玻璃呢,它们的红色浓度分别是r1和r2,透明度分别是a1和a2。那么第一块玻璃让人感受到的红色浓度为r1a1,第二块玻璃让人感受到的红色浓度为r2a2,第一块玻璃的红色色彩穿过第二块玻璃,并与第二块的红色叠加在一起的颜色浓度就是:

接下来,我们再把两块玻璃合起来,当成一块玻璃,这个整体的红色浓度为r,透明度为a。这个a我们之前已经推导过了,是a1+a2-a1a2。那么,我们有:

由这两个等式,我们可以得出:

g和b两个分量上也是如此,在此从略。从推导出来的等式上,我们能直接得出一个结论:颜色叠加的运算,不具备交换率、结合率,也就是说,叠加的顺序很重要。

最后来验证一下吧:

知乎上也有讨论 不断叠加两个 50% 透明的颜色是否能得到一个百分百不透明的颜色?

转载自 周骅

最新文章

  1. SQL Server Update 语句使用Nolock 语法
  2. Document
  3. mysql错误一例:ERROR 1030 (HY000): Got error 28 from storage engine
  4. Unicode 与 UTF 字符标准
  5. 数据结构和算法 c#– 1.单项链表
  6. Java中final的作用
  7. 上海SAP代理商 电子行业ERP系统 SAP金牌代理商达策
  8. 利用jsp和servlet,MySQL实现简易报表
  9. openPOWERLINK官方安装版例程(v2.3.0)附带mnobd.cdc文件断句
  10. 【MPI学习4】MPI并行程序设计模式:非阻塞通信MPI程序设计
  11. 解决IE下iframe默认有白色背景的bug
  12. APMServ5.2.6 升级PHP版本 到高版本 5.3,5.4
  13. 同一个页面多个CALayer重绘的办法
  14. Factovisors - PC110704
  15. form表单与后台请求的关系
  16. CSS3的动画属性
  17. QQ数据库管理
  18. flex.css
  19. python字典类型
  20. Linux学习笔记 软链接和硬链接

热门文章

  1. vm virtualBox下 centos7 Linux系统 与本地 window 系统 网络连接 配置
  2. Pytest+Allure环境的搭建
  3. Oracle EBS INV 查询物料无值 ECO
  4. SqlServer 一个查询语句导致tempdb增大55G(转载)
  5. 华为Eudemon 100E的密码恢复
  6. Character Sets: Migrating to utf8mb4 with pt_online_schema_change
  7. 关于<asp:checkBoxList>控件的对齐方法
  8. 监控文件内容变化,即时写入到新文件(tail)
  9. python基础学习21----进程
  10. 【转】Linux 高级的视角来查看Linux引导过程