b07be366b9ffcd2577c6c5083b1e9a31da9fab64795222ec031c27915ad66f543ebc0adea52e8c4466c2d7fd5bc46ca37040bc705e807b08d520554aeab0cb 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /*
  2. ## Color Convert
  3. http://blog.csdn.net/idfaya/article/details/6770414
  4. 颜色空间RGB与HSV(HSL)的转换
  5. */
  6. // https://github.com/harthur/color-convert/blob/master/conversions.js
  7. module.exports = {
  8. rgb2hsl: function rgb2hsl(rgb) {
  9. var r = rgb[0] / 255,
  10. g = rgb[1] / 255,
  11. b = rgb[2] / 255,
  12. min = Math.min(r, g, b),
  13. max = Math.max(r, g, b),
  14. delta = max - min,
  15. h, s, l;
  16. if (max == min)
  17. h = 0;
  18. else if (r == max)
  19. h = (g - b) / delta;
  20. else if (g == max)
  21. h = 2 + (b - r) / delta;
  22. else if (b == max)
  23. h = 4 + (r - g) / delta;
  24. h = Math.min(h * 60, 360);
  25. if (h < 0)
  26. h += 360;
  27. l = (min + max) / 2;
  28. if (max == min)
  29. s = 0;
  30. else if (l <= 0.5)
  31. s = delta / (max + min);
  32. else
  33. s = delta / (2 - max - min);
  34. return [h, s * 100, l * 100];
  35. },
  36. rgb2hsv: function rgb2hsv(rgb) {
  37. var r = rgb[0],
  38. g = rgb[1],
  39. b = rgb[2],
  40. min = Math.min(r, g, b),
  41. max = Math.max(r, g, b),
  42. delta = max - min,
  43. h, s, v;
  44. if (max === 0)
  45. s = 0;
  46. else
  47. s = (delta / max * 1000) / 10;
  48. if (max == min)
  49. h = 0;
  50. else if (r == max)
  51. h = (g - b) / delta;
  52. else if (g == max)
  53. h = 2 + (b - r) / delta;
  54. else if (b == max)
  55. h = 4 + (r - g) / delta;
  56. h = Math.min(h * 60, 360);
  57. if (h < 0)
  58. h += 360;
  59. v = ((max / 255) * 1000) / 10;
  60. return [h, s, v];
  61. },
  62. hsl2rgb: function hsl2rgb(hsl) {
  63. var h = hsl[0] / 360,
  64. s = hsl[1] / 100,
  65. l = hsl[2] / 100,
  66. t1, t2, t3, rgb, val;
  67. if (s === 0) {
  68. val = l * 255;
  69. return [val, val, val];
  70. }
  71. if (l < 0.5)
  72. t2 = l * (1 + s);
  73. else
  74. t2 = l + s - l * s;
  75. t1 = 2 * l - t2;
  76. rgb = [0, 0, 0];
  77. for (var i = 0; i < 3; i++) {
  78. t3 = h + 1 / 3 * -(i - 1);
  79. if (t3 < 0) t3++;
  80. if (t3 > 1) t3--;
  81. if (6 * t3 < 1)
  82. val = t1 + (t2 - t1) * 6 * t3;
  83. else if (2 * t3 < 1)
  84. val = t2;
  85. else if (3 * t3 < 2)
  86. val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
  87. else
  88. val = t1;
  89. rgb[i] = val * 255;
  90. }
  91. return rgb;
  92. },
  93. hsl2hsv: function hsl2hsv(hsl) {
  94. var h = hsl[0],
  95. s = hsl[1] / 100,
  96. l = hsl[2] / 100,
  97. sv, v;
  98. l *= 2;
  99. s *= (l <= 1) ? l : 2 - l;
  100. v = (l + s) / 2;
  101. sv = (2 * s) / (l + s);
  102. return [h, sv * 100, v * 100];
  103. },
  104. hsv2rgb: function hsv2rgb(hsv) {
  105. var h = hsv[0] / 60
  106. var s = hsv[1] / 100
  107. var v = hsv[2] / 100
  108. var hi = Math.floor(h) % 6
  109. var f = h - Math.floor(h)
  110. var p = 255 * v * (1 - s)
  111. var q = 255 * v * (1 - (s * f))
  112. var t = 255 * v * (1 - (s * (1 - f)))
  113. v = 255 * v
  114. switch (hi) {
  115. case 0:
  116. return [v, t, p]
  117. case 1:
  118. return [q, v, p]
  119. case 2:
  120. return [p, v, t]
  121. case 3:
  122. return [p, q, v]
  123. case 4:
  124. return [t, p, v]
  125. case 5:
  126. return [v, p, q]
  127. }
  128. },
  129. hsv2hsl: function hsv2hsl(hsv) {
  130. var h = hsv[0],
  131. s = hsv[1] / 100,
  132. v = hsv[2] / 100,
  133. sl, l;
  134. l = (2 - s) * v;
  135. sl = s * v;
  136. sl /= (l <= 1) ? l : 2 - l;
  137. l /= 2;
  138. return [h, sl * 100, l * 100];
  139. },
  140. // http://www.140byt.es/keywords/color
  141. rgb2hex: function(
  142. a, // red, as a number from 0 to 255
  143. b, // green, as a number from 0 to 255
  144. c // blue, as a number from 0 to 255
  145. ) {
  146. return "#" + ((256 + a << 8 | b) << 8 | c).toString(16).slice(1)
  147. },
  148. hex2rgb: function(
  149. a // take a "#xxxxxx" hex string,
  150. ) {
  151. a = '0x' + a.slice(1).replace(a.length > 4 ? a : /./g, '$&$&') | 0;
  152. return [a >> 16, a >> 8 & 255, a & 255]
  153. }
  154. }