memoserv/docs/srgb_linear.md

2.3 KiB
Raw Blame History

A close look at the sRGB formula

Source Specific page

The formulas for converting sRGB colors to linear, and the reverse, are usually given as follows:

sRGB to Linear

Condition            Value
0 ≤ S ≤ 0.04045      L = S/12.92
0.04045 < S ≤ 1      L = ((S+0.055)/1.055)^2.4
Linear to sRGB

Condition            Value
0 ≤ L ≤ 0.0031308    S = L×12.92
0.0031308 < L ≤ 1    S = 1.055×L^(1/2.4)  0.055

The definition uses two different functions a straight line and an exponential curve glued together at a certain “cutoff point”. The implication is that these functions (the ones in the sRGB to Linear definition) intersect at the point:

(0.0404500000000000, 0.00313080000000000)

If we take a close look at the function, though, we can see this intersection point is not exact, so the formula has a slight discontinuity:

  • sRGB: 0.0404500000000000
  • sRGB: 0.0404500000000001
  • Linear: 0.00313080495356037
  • Linera: 0.00313080728306769

If we extend the functions, we see that they actually intersect at two points:

  1. (0.0381547987133173, 0.00295315779514840)
  2. (0.0404482362771082, 0.00313066844250063)

If we use either of these two points as the cutoff point, there will be no discontinuity at all. Its apparent that the sRGB inventors selected the second of these points, and rounded its value to 4 significant digits to get 0.04045. They then used that rounded sRGB value to recalculate the Linear value, and got 0.00313080. I dont know why their Linear value has more significant digits (5 or 6) than their sRGB value (4).

I guess that if youre a perfectionist, and want no discontinuity at all, you can tweak the formulas like this:

sRGB to Linear

Condition                       Value
0 ≤ S ≤ 0.0404482362771082      L = S/12.92
0.0404482362771082 < S ≤ 1      L = ((S+0.055)/1.055)^2.4
Linear to sRGB

Condition                       Value
0 ≤ L ≤ 0.00313066844250063     S = L×12.92
0.00313066844250063 < L ≤ 1     S = 1.055×L^(1/2.4)  0.055

It doesnt make any practical difference. The two functions are extremely close together in this region, so the precise cutoff point is almost irrelevant.