hsv.js
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:4k
源码类别:

OA系统

开发平台:

Java

  1. /*
  2. Copyright (c) 2004-2006, The Dojo Foundation
  3. All Rights Reserved.
  4. Licensed under the Academic Free License version 2.1 or above OR the
  5. modified BSD license. For more information on Dojo licensing, see:
  6. http://dojotoolkit.org/community/licensing.shtml
  7. */
  8. dojo.provide("dojo.gfx.color.hsv");
  9. dojo.require("dojo.lang.array");
  10. dojo.require("dojo.math");
  11. dojo.lang.extend(dojo.gfx.color.Color, {toHsv:function () {
  12. return dojo.gfx.color.rgb2hsv(this.toRgb());
  13. }});
  14. dojo.gfx.color.rgb2hsv = function (r, g, b, options) {
  15. if (dojo.lang.isArray(r)) {
  16. if (g) {
  17. options = g;
  18. }
  19. b = r[2] || 0;
  20. g = r[1] || 0;
  21. r = r[0] || 0;
  22. }
  23. var opt = {inputRange:(options && options.inputRange) ? options.inputRange : 255, outputRange:(options && options.outputRange) ? options.outputRange : [255, 255, 255]};
  24. var h = null;
  25. var s = null;
  26. var v = null;
  27. switch (opt.inputRange) {
  28.   case 1:
  29. r = (r * 255);
  30. g = (g * 255);
  31. b = (b * 255);
  32. break;
  33.   case 100:
  34. r = (r / 100) * 255;
  35. g = (g / 100) * 255;
  36. b = (b / 100) * 255;
  37. break;
  38.   default:
  39. break;
  40. }
  41. var min = Math.min(r, g, b);
  42. v = Math.max(r, g, b);
  43. var delta = v - min;
  44. s = (v == 0) ? 0 : delta / v;
  45. if (s == 0) {
  46. h = 0;
  47. } else {
  48. if (r == v) {
  49. h = 60 * (g - b) / delta;
  50. } else {
  51. if (g == v) {
  52. h = 120 + 60 * (b - r) / delta;
  53. } else {
  54. if (b == v) {
  55. h = 240 + 60 * (r - g) / delta;
  56. }
  57. }
  58. }
  59. if (h <= 0) {
  60. h += 360;
  61. }
  62. }
  63. switch (opt.outputRange[0]) {
  64.   case 360:
  65. break;
  66.   case 100:
  67. h = (h / 360) * 100;
  68. break;
  69.   case 1:
  70. h = (h / 360);
  71. break;
  72.   default:
  73. h = (h / 360) * 255;
  74. break;
  75. }
  76. switch (opt.outputRange[1]) {
  77.   case 100:
  78. s = s * 100;
  79.   case 1:
  80. break;
  81.   default:
  82. s = s * 255;
  83. break;
  84. }
  85. switch (opt.outputRange[2]) {
  86.   case 100:
  87. v = (v / 255) * 100;
  88. break;
  89.   case 1:
  90. v = (v / 255);
  91. break;
  92.   default:
  93. break;
  94. }
  95. h = dojo.math.round(h);
  96. s = dojo.math.round(s);
  97. v = dojo.math.round(v);
  98. return [h, s, v];
  99. };
  100. dojo.gfx.color.hsv2rgb = function (h, s, v, options) {
  101. if (dojo.lang.isArray(h)) {
  102. if (s) {
  103. options = s;
  104. }
  105. v = h[2] || 0;
  106. s = h[1] || 0;
  107. h = h[0] || 0;
  108. }
  109. var opt = {inputRange:(options && options.inputRange) ? options.inputRange : [255, 255, 255], outputRange:(options && options.outputRange) ? options.outputRange : 255};
  110. switch (opt.inputRange[0]) {
  111.   case 1:
  112. h = h * 360;
  113. break;
  114.   case 100:
  115. h = (h / 100) * 360;
  116. break;
  117.   case 360:
  118. h = h;
  119. break;
  120.   default:
  121. h = (h / 255) * 360;
  122. }
  123. if (h == 360) {
  124. h = 0;
  125. }
  126. switch (opt.inputRange[1]) {
  127.   case 100:
  128. s /= 100;
  129. break;
  130.   case 255:
  131. s /= 255;
  132. }
  133. switch (opt.inputRange[2]) {
  134.   case 100:
  135. v /= 100;
  136. break;
  137.   case 255:
  138. v /= 255;
  139. }
  140. var r = null;
  141. var g = null;
  142. var b = null;
  143. if (s == 0) {
  144. r = v;
  145. g = v;
  146. b = v;
  147. } else {
  148. var hTemp = h / 60;
  149. var i = Math.floor(hTemp);
  150. var f = hTemp - i;
  151. var p = v * (1 - s);
  152. var q = v * (1 - (s * f));
  153. var t = v * (1 - (s * (1 - f)));
  154. switch (i) {
  155.   case 0:
  156. r = v;
  157. g = t;
  158. b = p;
  159. break;
  160.   case 1:
  161. r = q;
  162. g = v;
  163. b = p;
  164. break;
  165.   case 2:
  166. r = p;
  167. g = v;
  168. b = t;
  169. break;
  170.   case 3:
  171. r = p;
  172. g = q;
  173. b = v;
  174. break;
  175.   case 4:
  176. r = t;
  177. g = p;
  178. b = v;
  179. break;
  180.   case 5:
  181. r = v;
  182. g = p;
  183. b = q;
  184. break;
  185. }
  186. }
  187. switch (opt.outputRange) {
  188.   case 1:
  189. r = dojo.math.round(r, 2);
  190. g = dojo.math.round(g, 2);
  191. b = dojo.math.round(b, 2);
  192. break;
  193.   case 100:
  194. r = Math.round(r * 100);
  195. g = Math.round(g * 100);
  196. b = Math.round(b * 100);
  197. break;
  198.   default:
  199. r = Math.round(r * 255);
  200. g = Math.round(g * 255);
  201. b = Math.round(b * 255);
  202. }
  203. return [r, g, b];
  204. };