文章 "研究CCanvas类如何绘制透明的图形对象" - 页 6

 
Nikolai Semko:

彼得,这太简单了。

这是给你的一项任务,让你掌握和巩固问题的精髓:

- 如何将 ARGB(a1,r1,g1,b1)和 ARGB(a2,r2,g2,b2)两种颜色混合在一个图层中,而每种颜色都有自己的透明度 a1 和 a2?

如果没有这种混合效果,就不可能将反锯齿对象正确地叠加在一起。

快速浏览:在初始层颜色上,我们使用文章中描述的方法叠加第一个ARGB(a1,r1,g1,b1) 然后,在第一种颜色的基础上应用第二种颜色,根据相同的公式进行 ARGB 计算。只是这一次,底层颜色将是第一种颜色,我们将其放在原始图层颜色之上。

也许我错了,尼古拉,但为什么不可行呢?

我还没有做过实验,但第一种方法可能行不通,因为两个顶层的最终透明度计算错误。在这种情况下,您需要将中间图层与顶层图层混合,在获得它们的共同颜色后,将其叠加到原始图层上。

 
Реter Konow:

快速浏览:在初始层颜色上,我们使用文章中描述的方法叠加第一个ARGB(a1,r1,g1,b1) 然后,在第一种颜色的基础上应用第二种颜色,根据相同的公式进行 ARGB 计算。这一次,底层颜色将是第一种颜色,我们将其放在原始图层颜色之上。

也许我错了,尼古拉,但为什么不可行呢?

我还没有做过实验,但第一种方法可能行不通,因为两个顶层的最终透明度计算错误。在这种情况下,您需要将中间图层与顶层图层混合,在获得它们的共同颜色后,将其叠加到原始图层上。

这其实不是一件容易的事。
但是,谁能独立解决这个问题,谁就能当之无愧地成为色彩大师。
正因为没有这个公式,这篇文章的学术性就大打折扣了。
 
Nikolai Semko:
这其实是一个挑战,并不容易。
但是,谁能独立解决这个问题,谁就能当之无愧地成为色彩大师。

怎么做到的?你自己试验过吗?大概是将顶层颜色作为滤色镜使用,计算底层的每个分量(rgb)与顶层相应分量的水平和透明度的比例(这决定了有多少东西会从底层通过顶层)。 然后根据不透明度重新计算顶层分量的水平(这决定了有多少东西会留在顶层)。最后,计算底层和顶层每个分量的平均值(不是原始的底层和顶层,而是重新计算的,就像所写的)。我还没试过。

或者直接将各部分按透明度比例相加。

我得做个实验...有趣的任务

 
Dmitry Fedoseev:

怎么做?您自己试验过吗?

我在四年前就解决了这个问题,但当时动了很多脑筋。
如果我看到大家都在绞尽脑汁,却没人找到解决方案,我会把解决方案公布出来的。
 

Uffff...一切都变得简单多了,堆叠前无需过滤。只需按照透明度和不透明度的比例添加组件即可:

r=lr*(255-Alpha)/255+ur*Alpha/255;
g=lg*(255-Alpha)/255+ug*Alpha/255;
b=lb*(255-Alpha)/255+ub*Alpha/255;

Alpha:255--顶层不透明,0--完全透明。

lr, lg, lb - 底层的组成部分。

ur, ug, ub - 顶部的组成部分。

在终端中,黑色背景,红色方块不透明,其上是透明度为 50%的蓝色,然后是透明度为 50%的黄色。

在 Photoshop 中也是如此:


 
Dmitry Fedoseev:

Uffff...一切都变得简单多了,堆叠前无需过滤。只需按照透明度和不透明度的比例添加组件即可:

Alpha:255 - 顶层不透明,0 - 完全透明。

lr, lg, lb - 底层的组成部分。

ur, ug, ub - 顶部的组成部分。

等我回到电脑前,我会尝试用这个公式混合两幅透明图像,看看会发生什么。:))
 
Nikolai Semko:
我会去我的电脑上,用这个公式把两张透明图片混合起来,看看会发生什么。:))

如何混合两张透明图片?第一张叠加在背景上,然后第二张叠加在结果上。

一般来说,您也可以将两张透明图片折叠,然后叠加在背景上,但现在不谈这个。

***

学习 Photoshop 中的所有图层叠加方法会特别有趣。

 
Dmitry Fedoseev:

Uffff...一切都变得简单多了,堆叠前无需过滤。只需按照透明度和不透明度的比例添加组件即可:

r=lr*(255-Alpha)/255+ur*Alpha/255;
g=lg*(255-Alpha)/255+ug*Alpha/255;
b=lb*(255-Alpha)/255+ub*Alpha/255;

Alpha:255 - 顶层不透明,0 - 完全透明。

lr, lg, lb - 底层的组成部分。

ur, ug, ub - 顶部元件。

在终端中,背景为黑色,红色方块不透明,其上是透明度为 50%的蓝色,然后是透明度为 50%的黄色。

在 photoshop 中也是如此:

并非如此...

关键是有 Alpha1 和 Alpha2。

因此,您不仅需要计算新形成的混合色,还需要计算新形成的透明度。

你基本上重复了文章作者的公式,将透明色与背景色混合:

result=backgraund*(1-alpha)+foreground

的公式:

result=backgraund*(1-alpha)+foreground*alpha

您的变体是正确的,但文章作者在一个简单的公式中犯了错误,有趣的是,Peter 还感谢 他提供了这个公式 :))))。

毕竟,你可以用肉眼看到作者的公式中很容易出现 uchar 溢出。奇怪的是,4 年来竟然没有人发现这个严重错误。

 

这就是混合其他透明色的算法:


 
为什么要将两个透明层混合后再涂抹?先涂一层,再涂另一层。