因此,给定 #000000 和 #444444,您可以计算对比度(在本例中为 2.15)。数学很简单,虽然有点毛茸茸。 (参见“relative luminance”的定义。)
现在你想倒退吗?如果你有 #000000 并且想要 4.5 的比率,从 #444444 开始,颜色应该是什么?是这样吗
我需要颠倒我的对比公式
是什么意思?
这有点复杂,因为您要求解 3 个变量,即红色、绿色和蓝色分量,而且亮度公式并未平等对待红色、绿色和蓝色。它使用 21.25% 的红色、71.5% 的绿色和 7.25% 的蓝色。
另外,亮度公式不是简单的线性公式,因此您不能只取亮度不足的百分比,然后将颜色值提高相同的百分比。
例如,在您的情况下,比率是 2.15,但您需要它是 4.5。 2.15 比期望值 4.5 低 108%。
但是,如果您查看原始 RGB 值 #444444 并计算出它需要为 #757575(以便获得 4.5 的比率),那么如果您将这些 RGB 值视为简单数字(并转换为十进制) ,则 #444444 (4473924) 比 #757575 (7697781) 少 72%。
因此,您的比率少了 108%,但 RGB 值少了 72%。因此你不能做一个简单的线性方程。
(由于#757575 给你的比率是 4.56,而不是精确的 4.5,所以这些数字并不完全准确。如果你使用 #747474,你会得到 4.49 的比率,这对于 WCAG 来说太小了一点合规性,但比 4.56 更接近 4.5。但是,#444444 比 #747474 少 71%,所以它仍然不同于 2.15 比 4.5 少 108%,所以基本概念仍然适用。) p>
只是为了好玩,我查看了 0x11111 到 0x666666 的值,以 0x111111 递增,并计算了对比度。图表上没有足够的点,所以我在 0x111111 和 0x222222 之间添加了一个颜色,然后在 0x222222 和 0x333333 之间添加了一个颜色,等等。
RGB contrast % from 4.5 % from 0x747474
111111 1.11 305.41% 582.35%
191919 1.19 278.15% 364.00%
222222 1.32 240.91% 241.18%
2a2a2a 1.46 208.22% 176.19%
333333 1.66 171.08% 127.45%
3b3b3b 1.87 140.64% 96.61%
444444 2.16 108.33% 70.59%
4c4c4c 2.45 83.67% 52.63%
555555 2.82 59.57% 36.47%
5d5d5d 3.19 41.07% 24.73%
666666 3.66 22.95% 13.73%
6e6e6e 4.12 9.22% 5.45%
如您所见,在第 3 个数据点处相交的线然后彼此会聚。我确定其中有一个公式,因此您可以获取对比度百分比,对其执行一些(可能是对数)函数并获得更改颜色所需的百分比。
这将是一个有趣的数学问题,我目前没有时间玩。
2019 年 1 月 18 日更新
我让它向后工作,但它不能处理边缘情况,例如当使深色变暗但您已经达到最大值(或浅色较浅但您达到最大值)时。但也许你可以玩它。
测试用例
-
#ee0add 浅色(洋红色)
-
#445566为深色(深灰色)
- 对比度2.09
在计算颜色的“relative luminance”时,它有一个条件语句。
if X <= 0.03928 then
X = X/12.92
else
X = ((X+0.055)/1.055) ^ 2.4
在该条件下使用 X 之前,它被 除以 255 以标准化 0 和 1 之间的值。因此,如果您采用条件值 0.03928,然后 乘以乘以 255,你得到 10.0164。由于 RGB 值必须是整数,这意味着 10 (0x0A) 或更少的 RGB 分量将通过“if”,而任何 11 (0x0B) 或更大的分量将通过“else”。因此,在我的测试用例值中,我希望颜色部分之一为 10 (0x0A) (#EE0ADD)。
#ee0add 的相对亮度为 0.23614683378171950172526363525113 (0.236)
#445566 的相对亮度为 0.0868525191131797135799815832377 (0.0868)
“contrast ratio”是
(0.236 + .05) / (0.0868 + .05) = 2.09
(您可以在https://webaim.org/resources/contrastchecker/?fcolor=EE0ADD&bcolor=445566 上验证此比率)
如果我们想要 4.5 的比率,并且我们希望 #ee0add 不变,那么我们必须调整 #445566。这意味着您需要解决:
4.5 = (0.236 + .05) / (XX + .05)
所以第二个亮度值(XX)需要为0.01358818528482655593894747450025(0.0136)
The original second luminance value was 0.0868525191131797135799815832377 (0.0868), so to get 0.01358818528482655593894747450025 (0.0136), we need to multiply the original by 0.15645125119651910313960717062698 (0.0136 / 0.0868 = 0.156) (or 15.6% of the original value)
如果我们将 15.6% 应用于 R、G 和 B 的相对亮度值中的每一个,然后逆向执行上面的条件语句,就可以得到 RGB 值。
#445566 的原始亮度
r = 0x44 = 68
g = 0x55 = 85
b = 0x66 = 102
r1 = 68 / 255 = 0.26666666666666666666666666666667
g1 = 85 / 255 = 0.33333333333333333333333333333333
b1 = 102 / 255 = 0.4
r2 = ((.267 + .055) / 1.055)^^2.4 = 0.05780543019106721120703816752337
g2 = ((.333 + .055) / 1.055)^^2.4 = 0.09084171118340767766490119106965
b2 = ((.400 + .055) / 1.055)^^2.4 = 0.13286832155381791428570549818868
l = 0.2126 * r2 + 0.7152 * g2 + 0.0722 * b2
= 0.0868525191131797135799815832377
向后工作,取 r2、g2 和 b2 值的 15.6%
r2 = 0.05780543019106721120703816752337 * 15.6% = 0.00904373187934550551617004082875
g2 = 0.09084171118340767766490119106965 * 15.6% = 0.01421229937547695322310904970549
b2 = 0.13286832155381791428570549818868 * 15.6% = 0.02078741515147623990363062978804
现在撤消 ^^2.4 和其他东西的混乱
- 要撤消
X^^2.4,你必须做相反的操作,X^^(1/2.4) 或X^^(0.4167)
- 然后乘以 1.055
- 然后减去 0.055
- 然后乘以 255
pow( 0.00904373187934550551617004082875, 1/2.4) = 0.14075965680504652191078668676178
pow( 0.01421229937547695322310904970549, 1/2.4) = 0.16993264267137740728089791717873
pow( 0.02078741515147623990363062978804, 1/2.4) = 0.19910562853770829265100914759565
乘以 1.055
0.14075965680504652191078668676178 * 1.055 = 0.14850143792932408061587995453368
0.16993264267137740728089791717873 * 1.055 = 0.17927893801830316468134730262356
0.19910562853770829265100914759565 * 1.055 = 0.21005643810728224874681465071341
减去 0.055
0.14850143792932408061587995453368 - 0.055 = 0.09350143792932408061587995453368
0.17927893801830316468134730262356 - 0.055 = 0.12427893801830316468134730262356
0.21005643810728224874681465071341 - 0.055 = 0.15505643810728224874681465071341
乘以 255
0.09350143792932408061587995453368 * 255 = 23.842866671977640557049388406088 = 24 = 0x18
0.12427893801830316468134730262356 * 255 = 31.691129194667306993743562169008 = 32 = 0x20
0.15505643810728224874681465071341 * 255 = 39.53939171735697343043773593192 = 40 = 0x28
所以较深的颜色是#182028。可能存在一些舍入错误,但如果您检查原始前景色 #ee0add 和新颜色 #182028,您会得到 4.48 的对比度。略低于 4.5,但正如我所说,可能存在一些舍入错误。
https://webaim.org/resources/contrastchecker/?fcolor=EE0ADD&bcolor=182028
我尝试用#ee0add 做同样的事情,保持#445566 不变,但是当倒退到最后一步乘以 255 时,我得到大于 255 的数字,这不是有效的 RGB 分量(它们最多只能达到 0xFF)。如果我将数字停在 255,然后将其差值加到最小的颜色值上,我得到了一个不错的颜色,但比率为 5.04,超过了 4.5。如果你愿意,我也可以发布这个数学。