颜色计算:增加透明度但在白色背景下保持相同的颜色外观

3

一般问题:

如何计算RGB颜色的值,以便在更改alpha分量时,颜色看起来在白色背景上保持不变?

附加问题:

如何在非白色背景色下进行相同操作?

注:

  1. 我知道并非所有颜色都能这样做。例如,rgba(1,0,0,1)的第一个参数不能增加以补偿像rgba(1.1,0,0,0.9)这样的alpha。

  2. 对于像在此示例中的单色色彩,这是微不足道的:

enter image description here

我的当前用例:

我正在开发一个iOS应用程序,具有略透明的状态栏/导航栏。应该出现与内容视图中某些(不透明)对象具有相同颜色的栏。如果我将相同的颜色应用于带有95% alpha 的栏和内容,则当然会使栏变亮。我还需要使用CSS为类似的Web应用程序找到解决方案。

4个回答

4

我知道这个问题已经快一年了,但我也遇到了同样的问题并找到了解决方案,所以我想分享一下。这个术语叫做“alpha合成”,维基百科上有一篇很棒的文章。

http://en.wikipedia.org/wiki/Alpha_compositing

在你的情况下,你正在将你的颜色与完全不透明的白色rgba(255,255,255,1)进行合成。

我制作了一个Excel计算器来完成这个操作。我无法弄清楚如何将单元格值本身放入StackOverflow,因此这里是公式的屏幕截图。橙色单元格用于输入。

Excel Formulas

然后,您可以更改A10-A13来定义您的初始颜色,并更改D10以指定所需的alpha值。

Combined known colors           
    Color 1 Color 2 Combined
A   0.15    1   =$B$3+$C$3*(1-$B$3)
R   255 255 =(1/($D$3))*(B4*$B$3+C4*$C$3*(1-$B$3))
G   0   255 =(1/($D$3))*(B5*$B$3+C5*$C$3*(1-$B$3))
B   0   255 =(1/($D$3))*(B6*$B$3+C6*$C$3*(1-$B$3))

1 Known Color, Known result Alpha           
    Color 1 Color 2 Combined
A   0.15    =(D10-B10)/(1-B10)  0.85
R   255 255 =(1/($D$10))*(B11*$B$10+C11*$C$10*(1-$B$10))
G   255 255 =(1/($D$10))*(B12*$B$10+C12*$C$10*(1-$B$10))
B   0   255 =(1/($D$10))*(B13*$B$10+C13*$C$10*(1-$B$10))

0

使用[UIColor colorWithRed:191.0/255.0 green:127.0/255.0 blue:127.0/255.0 alpha:1.0]

如果您想将不透明度设置为90%,请将alpha设置为0.9

编辑:您无法通过不透明度获取另一种颜色的确切颜色,最好始终具有纯色的RGB并添加不透明度值。


我认为这并没有回答问题。 - Lyndsey Scott

0

不要将.95 alpha颜色设置为模拟不透明颜色,也许你应该尝试反过来,使用带有透明度的视图作为指南来设置不透明颜色。

这样,您可以使用CG图像上下文组合两个视图--一个具有纯白背景颜色位于.95 alpha背景颜色之下--然后获取该结果视图中像素的颜色,然后将其设置为不透明视图的颜色。

这里有一个关于如何获取像素颜色的好答案:如何在UIView中获取像素的颜色?


在我的情况下,“指南”颜色来自客户提供的图像,因此我不能像你建议的那样操作。然而,这可能是其他用例的可行方法。另外,我希望有人能够提供一些关于其中涉及的数学知识的见解。 - de.

0

好的,我有一个针对我的使用案例的变通方法,我想分享一下。

尽管如此,这并不是我原始问题的答案,原始问题是关于需要进行数学计算来适应颜色的。
我仍然非常有兴趣得到“真正”的答案!

无论如何,这是我的解决方案:
我将所有viewController的视图的背景颜色属性设置为没有alpha通道的原始颜色。我使用1x2048像素的patternImageColor,并且其顶部64像素是原始的栏颜色,其余部分是表格背景颜色。 原始的栏颜色透过半透明栏颜色透出,结果仍然是原始的颜色。滚动在栏和背景之间的内容仍然透过栏显示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接