]>
Commit | Line | Data |
---|---|---|
30c337cf AD |
1 | <?php |
2 | ### RGB >> HSL | |
3 | function _color_rgb2hsl($rgb) { | |
4 | $r = $rgb[0]; $g = $rgb[1]; $b = $rgb[2]; | |
5 | $min = min($r, min($g, $b)); $max = max($r, max($g, $b)); | |
6 | $delta = $max - $min; $l = ($min + $max) / 2; $s = 0; | |
7 | if ($l > 0 && $l < 1) { | |
8 | $s = $delta / ($l < 0.5 ? (2 * $l) : (2 - 2 * $l)); | |
9 | } | |
10 | $h = 0; | |
11 | if ($delta > 0) { | |
12 | if ($max == $r && $max != $g) $h += ($g - $b) / $delta; | |
13 | if ($max == $g && $max != $b) $h += (2 + ($b - $r) / $delta); | |
14 | if ($max == $b && $max != $r) $h += (4 + ($r - $g) / $delta); | |
15 | $h /= 6; | |
16 | } return array($h, $s, $l); | |
17 | } | |
18 | ||
19 | ### HSL >> RGB | |
20 | function _color_hsl2rgb($hsl) { | |
21 | $h = $hsl[0]; $s = $hsl[1]; $l = $hsl[2]; | |
22 | $m2 = ($l <= 0.5) ? $l * ($s + 1) : $l + $s - $l*$s; | |
23 | $m1 = $l * 2 - $m2; | |
24 | return array(_color_hue2rgb($m1, $m2, $h + 0.33333), | |
25 | _color_hue2rgb($m1, $m2, $h), | |
26 | _color_hue2rgb($m1, $m2, $h - 0.33333)); | |
27 | } | |
28 | ||
29 | ### Helper function for _color_hsl2rgb(). | |
30 | function _color_hue2rgb($m1, $m2, $h) { | |
31 | $h = ($h < 0) ? $h + 1 : (($h > 1) ? $h - 1 : $h); | |
32 | if ($h * 6 < 1) return $m1 + ($m2 - $m1) * $h * 6; | |
33 | if ($h * 2 < 1) return $m2; | |
34 | if ($h * 3 < 2) return $m1 + ($m2 - $m1) * (0.66666 - $h) * 6; | |
35 | return $m1; | |
36 | } | |
37 | ||
38 | ### Convert a hex color into an RGB triplet. | |
39 | function _color_unpack($hex, $normalize = false) { | |
40 | if (strlen($hex) == 4) { | |
41 | $hex = $hex[1] . $hex[1] . $hex[2] . $hex[2] . $hex[3] . $hex[3]; | |
42 | } $c = hexdec($hex); | |
43 | for ($i = 16; $i >= 0; $i -= 8) { | |
44 | $out[] = (($c >> $i) & 0xFF) / ($normalize ? 255 : 1); | |
45 | } return $out; | |
46 | } | |
47 | ||
48 | ### Convert an RGB triplet to a hex color. | |
49 | function _color_pack($rgb, $normalize = false) { | |
50 | foreach ($rgb as $k => $v) { | |
51 | $out |= (($v * ($normalize ? 255 : 1)) << (16 - $k * 8)); | |
52 | }return '#'. str_pad(dechex($out), 6, 0, STR_PAD_LEFT); | |
53 | } | |
54 | ||
55 | function rgb2hsl($arr) { | |
56 | $r = $arr[0]; | |
57 | $g = $arr[1]; | |
58 | $b = $arr[2]; | |
59 | ||
60 | $var_R = ($r / 255); | |
61 | $var_G = ($g / 255); | |
62 | $var_B = ($b / 255); | |
63 | ||
64 | $var_Min = min($var_R, $var_G, $var_B); | |
65 | $var_Max = max($var_R, $var_G, $var_B); | |
66 | $del_Max = $var_Max - $var_Min; | |
67 | ||
68 | $v = $var_Max; | |
69 | ||
70 | if ($del_Max == 0) { | |
71 | $h = 0; | |
72 | $s = 0; | |
73 | } else { | |
74 | $s = $del_Max / $var_Max; | |
75 | ||
76 | $del_R = ( ( ( $max - $var_R ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max; | |
77 | $del_G = ( ( ( $max - $var_G ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max; | |
78 | $del_B = ( ( ( $max - $var_B ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max; | |
79 | ||
80 | if ($var_R == $var_Max) $h = $del_B - $del_G; | |
81 | else if ($var_G == $var_Max) $h = ( 1 / 3 ) + $del_R - $del_B; | |
82 | else if ($var_B == $var_Max) $h = ( 2 / 3 ) + $del_G - $del_R; | |
83 | ||
84 | if ($H < 0) $h++; | |
85 | if ($H > 1) $h--; | |
86 | } | |
87 | ||
88 | return array($h, $s, $v); | |
89 | } | |
90 | ||
91 | function hsl2rgb($arr) { | |
92 | $h = $arr[0]; | |
93 | $s = $arr[1]; | |
94 | $v = $arr[2]; | |
95 | ||
96 | if($s == 0) { | |
97 | $r = $g = $B = $v * 255; | |
98 | } else { | |
99 | $var_H = $h * 6; | |
100 | $var_i = floor( $var_H ); | |
101 | $var_1 = $v * ( 1 - $s ); | |
102 | $var_2 = $v * ( 1 - $s * ( $var_H - $var_i ) ); | |
103 | $var_3 = $v * ( 1 - $s * (1 - ( $var_H - $var_i ) ) ); | |
104 | ||
105 | if ($var_i == 0) { $var_R = $v ; $var_G = $var_3 ; $var_B = $var_1 ; } | |
106 | else if ($var_i == 1) { $var_R = $var_2 ; $var_G = $v ; $var_B = $var_1 ; } | |
107 | else if ($var_i == 2) { $var_R = $var_1 ; $var_G = $v ; $var_B = $var_3 ; } | |
108 | else if ($var_i == 3) { $var_R = $var_1 ; $var_G = $var_2 ; $var_B = $v ; } | |
109 | else if ($var_i == 4) { $var_R = $var_3 ; $var_G = $var_1 ; $var_B = $v ; } | |
110 | else { $var_R = $v ; $var_G = $var_1 ; $var_B = $var_2 ; } | |
111 | ||
112 | $r = $var_R * 255; | |
113 | $g = $var_G * 255; | |
114 | $B = $var_B * 255; | |
115 | } | |
116 | return array($r, $g, $B); | |
117 | } | |
118 | ||
119 | ?> |