图形处理WIKI
+ -

sRGB Gamma 校正(编码)

2026-03-20 6 0
  1. 人眼感知的非线性特性

人眼对暗部细节更敏感,对亮部变化不那么敏感。如果用线性方式存储颜色值,会浪费大量精度在亮部,而暗部精度不足。Gamma 校正通过”压缩”亮部、扩展暗部,使有限的位深(如 8-bit)能更有效地存储颜色。

  1. 分段设计的目的
  • 线性段 (u ≤ 0.0031308) :避免在极暗区域因幂函数导致的数值精度问题,确保在接近 0 时函数平滑过渡
  • 幂函数段 (u > 0.0031308) :主 Gamma 曲线,指数约 1/2.4 ≈ 0.417(接近 1/2.2)
条件 公式
u ≤ 0.0031308 12.92 × u (线性段)
u > 0.0031308 1.055 × u^(1/2.4) - 0.055 (幂函数段)
static inline float gs_srgb_linear_to_nonlinear(float u)
{
    return (u <= 0.0031308f) ? (12.92f * u)
                             : ((1.055f * powf(u, 1.0f / 2.4f)) - 0.055f);
}

=IF(A1<=0.0031308, 12.92*A1, 1.055*POWER(A1, 1/2.4)-0.055)

sRGB非线性 → 线性空间 → Alpha预乘 → sRGB非线性

线性值 u 阈值判断 公式 结果
0.000 u ≤ 0.0031308 12.92 × u 0.000
0.001 u ≤ 0.0031308 12.92 × u 0.01292
0.002 u ≤ 0.0031308 12.92 × u 0.02584
0.003 u ≤ 0.0031308 12.92 × u 0.03876
0.0031308 边界点 12.92 × u 0.04045
0.004 u > 0.0031308 1.055 × u^(1/2.4) - 0.055 0.04767
0.005 u > 0.0031308 1.055 × u^(1/2.4) - 0.055 0.05439
0.010 u > 0.0031308 1.055 × u^(1/2.4) - 0.055 0.08330
0.020 u > 0.0031308 1.055 × u^(1/2.4) - 0.055 0.12210
0.050 u > 0.0031308 1.055 × u^(1/2.4) - 0.055 0.19982
0.100 u > 0.0031308 1.055 × u^(1/2.4) - 0.055 0.28823
0.200 u > 0.0031308 1.055 × u^(1/2.4) - 0.055 0.40220
0.300 u > 0.0031308 1.055 × u^(1/2.4) - 0.055 0.49162
0.400 u > 0.0031308 1.055 × u^(1/2.4) - 0.055 0.56901
0.500 u > 0.0031308 1.055 × u^(1/2.4) - 0.055 0.63870
0.600 u > 0.0031308 1.055 × u^(1/2.4) - 0.055 0.70293
0.700 u > 0.0031308 1.055 × u^(1/2.4) - 0.055 0.76306
0.800 u > 0.0031308 1.055 × u^(1/2.4) - 0.055 0.81994
0.900 u > 0.0031308 1.055 × u^(1/2.4) - 0.055 0.87421
1.000 u > 0.0031308 1.055 × u^(1/2.4) - 0.055 1.00000

142138758243

逆函数

static inline float gs_srgb_linear_to_nonlinear(float u)
{
    return (u <= 0.0031308f) ? (12.92f * u)
                 : ((1.055f * powf(u, 1.0f / 2.4f)) - 0.055f);
}
=IF(A1<=0.04045, A1/12.92, POWER((A1+0.055)/1.055, 2.4))
非线性值 u 阈值判断 公式 结果
0.000 u ≤ 0.04045 u / 12.92 0.000
0.010 u ≤ 0.04045 u / 12.92 0.000774
0.020 u ≤ 0.04045 u / 12.92 0.001548
0.030 u ≤ 0.04045 u / 12.92 0.002322
0.04045 边界点 u / 12.92 0.0031308
0.050 u > 0.04045 ((u+0.055)/1.055)^2.4 0.00511
0.080 u > 0.04045 ((u+0.055)/1.055)^2.4 0.01387
0.100 u > 0.04045 ((u+0.055)/1.055)^2.4 0.02287
0.200 u > 0.04045 ((u+0.055)/1.055)^2.4 0.09931
0.300 u > 0.04045 ((u+0.055)/1.055)^2.4 0.21223
0.400 u > 0.04045 ((u+0.055)/1.055)^2.4 0.35164
0.500 u > 0.04045 ((u+0.055)/1.055)^2.4 0.51367
0.600 u > 0.04045 ((u+0.055)/1.055)^2.4 0.69599
0.700 u > 0.04045 ((u+0.055)/1.055)^2.4 0.79635
0.800 u > 0.04045 ((u+0.055)/1.055)^2.4 0.86948
0.900 u > 0.04045 ((u+0.055)/1.055)^2.4 0.93716
1.000 u > 0.04045 ((u+0.055)/1.055)^2.4 1.00000

两个函数在边界点(0.0031308 ↔ 0.04045)处平滑衔接,互为逆函数

0 篇笔记 写笔记

作者信息
站长漫谈
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!