-
Notifications
You must be signed in to change notification settings - Fork 1
/
colorconversion.go
77 lines (64 loc) · 1.73 KB
/
colorconversion.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package colorcrop
import (
"image/color"
"math"
)
// colorToXYZ returns CIE XYZ representation of color.
// https://en.wikipedia.org/wiki/Color_model#CIE_XYZ_color_space
func colorToXYZ(color color.Color) (x, y, z float64) {
r, g, b, _ := color.RGBA()
varR := float64(r>>8) / 255
varG := float64(g>>8) / 255
varB := float64(b>>8) / 255
if varR > 0.04045 {
varR = math.Pow((varR+0.055)/1.055, 2.4)
} else {
varR = varR / 12.92
}
if varG > 0.04045 {
varG = math.Pow((varG+0.055)/1.055, 2.4)
} else {
varG = varG / 12.92
}
if varB > 0.04045 {
varB = math.Pow((varB+0.055)/1.055, 2.4)
} else {
varB = varB / 12.92
}
x = varR*41.24 + varG*35.76 + varB*18.05
y = varR*21.26 + varG*71.52 + varB*7.22
z = varR*1.93 + varG*11.92 + varB*95.05
return x, y, z
}
// xyztoLAB converts CIE XYZ color space to CIE LAB color space
// https://en.wikipedia.org/wiki/Lab_color_space#CIELAB-CIEXYZ_conversions
func xyztoLAB(x, y, z float64) (l, a, b float64) {
refX, refY, refZ := 95.047, 100.000, 108.883 // Daylight, sRGB, Adobe-RGB, Observer D65, 2°
varX := x / refX
varY := y / refY
varZ := z / refZ
if varX > 0.008856 {
varX = math.Pow(varX, (1.0 / 3.0))
} else {
varX = (7.787 * varX) + (16.0 / 116.0)
}
if varY > 0.008856 {
varY = math.Pow(varY, (1.0 / 3.0))
} else {
varY = (7.787 * varY) + (16.0 / 116.0)
}
if varZ > 0.008856 {
varZ = math.Pow(varZ, (1.0 / 3.0))
} else {
varZ = (7.787 * varZ) + (16.0 / 116.0)
}
l = (116 * varY) - 16
a = 500 * (varX - varY)
b = 200 * (varY - varZ)
return l, a, b
}
// colorToLAB returns LAB representation of any color (without aplha)
// https://en.wikipedia.org/wiki/Lab_color_space
func colorToLAB(color color.Color) (l, a, b float64) {
return xyztoLAB(colorToXYZ(color))
}