| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- /*
- ## Color Convert
- http://blog.csdn.net/idfaya/article/details/6770414
- 颜色空间RGB与HSV(HSL)的转换
- */
- // https://github.com/harthur/color-convert/blob/master/conversions.js
- module.exports = {
- rgb2hsl: function rgb2hsl(rgb) {
- var r = rgb[0] / 255,
- g = rgb[1] / 255,
- b = rgb[2] / 255,
- min = Math.min(r, g, b),
- max = Math.max(r, g, b),
- delta = max - min,
- h, s, l;
- if (max == min)
- h = 0;
- else if (r == max)
- h = (g - b) / delta;
- else if (g == max)
- h = 2 + (b - r) / delta;
- else if (b == max)
- h = 4 + (r - g) / delta;
- h = Math.min(h * 60, 360);
- if (h < 0)
- h += 360;
- l = (min + max) / 2;
- if (max == min)
- s = 0;
- else if (l <= 0.5)
- s = delta / (max + min);
- else
- s = delta / (2 - max - min);
- return [h, s * 100, l * 100];
- },
- rgb2hsv: function rgb2hsv(rgb) {
- var r = rgb[0],
- g = rgb[1],
- b = rgb[2],
- min = Math.min(r, g, b),
- max = Math.max(r, g, b),
- delta = max - min,
- h, s, v;
- if (max === 0)
- s = 0;
- else
- s = (delta / max * 1000) / 10;
- if (max == min)
- h = 0;
- else if (r == max)
- h = (g - b) / delta;
- else if (g == max)
- h = 2 + (b - r) / delta;
- else if (b == max)
- h = 4 + (r - g) / delta;
- h = Math.min(h * 60, 360);
- if (h < 0)
- h += 360;
- v = ((max / 255) * 1000) / 10;
- return [h, s, v];
- },
- hsl2rgb: function hsl2rgb(hsl) {
- var h = hsl[0] / 360,
- s = hsl[1] / 100,
- l = hsl[2] / 100,
- t1, t2, t3, rgb, val;
- if (s === 0) {
- val = l * 255;
- return [val, val, val];
- }
- if (l < 0.5)
- t2 = l * (1 + s);
- else
- t2 = l + s - l * s;
- t1 = 2 * l - t2;
- rgb = [0, 0, 0];
- for (var i = 0; i < 3; i++) {
- t3 = h + 1 / 3 * -(i - 1);
- if (t3 < 0) t3++;
- if (t3 > 1) t3--;
- if (6 * t3 < 1)
- val = t1 + (t2 - t1) * 6 * t3;
- else if (2 * t3 < 1)
- val = t2;
- else if (3 * t3 < 2)
- val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
- else
- val = t1;
- rgb[i] = val * 255;
- }
- return rgb;
- },
- hsl2hsv: function hsl2hsv(hsl) {
- var h = hsl[0],
- s = hsl[1] / 100,
- l = hsl[2] / 100,
- sv, v;
- l *= 2;
- s *= (l <= 1) ? l : 2 - l;
- v = (l + s) / 2;
- sv = (2 * s) / (l + s);
- return [h, sv * 100, v * 100];
- },
- hsv2rgb: function hsv2rgb(hsv) {
- var h = hsv[0] / 60
- var s = hsv[1] / 100
- var v = hsv[2] / 100
- var hi = Math.floor(h) % 6
- var f = h - Math.floor(h)
- var p = 255 * v * (1 - s)
- var q = 255 * v * (1 - (s * f))
- var t = 255 * v * (1 - (s * (1 - f)))
- v = 255 * v
- switch (hi) {
- case 0:
- return [v, t, p]
- case 1:
- return [q, v, p]
- case 2:
- return [p, v, t]
- case 3:
- return [p, q, v]
- case 4:
- return [t, p, v]
- case 5:
- return [v, p, q]
- }
- },
- hsv2hsl: function hsv2hsl(hsv) {
- var h = hsv[0],
- s = hsv[1] / 100,
- v = hsv[2] / 100,
- sl, l;
- l = (2 - s) * v;
- sl = s * v;
- sl /= (l <= 1) ? l : 2 - l;
- l /= 2;
- return [h, sl * 100, l * 100];
- },
- // http://www.140byt.es/keywords/color
- rgb2hex: function(
- a, // red, as a number from 0 to 255
- b, // green, as a number from 0 to 255
- c // blue, as a number from 0 to 255
- ) {
- return "#" + ((256 + a << 8 | b) << 8 | c).toString(16).slice(1)
- },
- hex2rgb: function(
- a // take a "#xxxxxx" hex string,
- ) {
- a = '0x' + a.slice(1).replace(a.length > 4 ? a : /./g, '$&$&') | 0;
- return [a >> 16, a >> 8 & 255, a & 255]
- }
- }
|