sRGB Gamma 校正(编码)
2026-03-20
6
0
- 人眼感知的非线性特性
人眼对暗部细节更敏感,对亮部变化不那么敏感。如果用线性方式存储颜色值,会浪费大量精度在亮部,而暗部精度不足。Gamma 校正通过”压缩”亮部、扩展暗部,使有限的位深(如 8-bit)能更有效地存储颜色。
- 分段设计的目的
- 线性段 (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 |

逆函数
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)处平滑衔接,互为逆函数
图形处理WIKI





