0%

颜色混合

将背景颜色 A 和叠加颜色 B 混合,得到颜色 C,可通过以下公式计算(见 https://en.wikipedia.org/wiki/Alpha_compositing

举个例子,css 里指定使用 groove 等自动变双色的 border 时,颜色变深的逻辑是由浏览器自行实现的,而在 WebKit 里的实现方式是在原色的前面叠加 000 33% 而成。

对应计算 rgba 的方式为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- (UIColor *)deepColorForBorderColor:(UIColor *)color
{
CGFloat srcR = 0;
CGFloat srcG = 0;
CGFloat srcB = 0;
CGFloat srcA = 0.33;

CGFloat dstR = 0;
CGFloat dstG = 0;
CGFloat dstB = 0;
CGFloat dstA = 0;
[color getRed:&dstR green:&dstG blue:&dstB alpha:&dstA];

CGFloat outR,outG,outB,outA;
outA = srcA + dstA * (1 - srcA);
outR = (srcR * srcA + dstR * dstA * (1 - srcA)) / outA; // 可以对 outA == 0 的情况兜个底,但意义不大
outG = (srcG * srcA + dstG * dstA * (1 - srcA)) / outA;
outB = (srcB * srcA + dstB * dstA * (1 - srcA)) / outA;
return [UIColor colorWithRed:outR green:outG blue:outB alpha:outA];
}