You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

83 lines
2.1 KiB

  1. import type { ColorHS, ColorRGB, ColorXY } from "$lib/models/color";
  2. import XY_MAP from "./color-xy.json";
  3. import K_MAP from "./color-k.json";
  4. export function rgbToHex(rgb: ColorRGB): string {
  5. const r = Math.min(Math.round(rgb.red * 255), 255).toString(16).padStart(2, "0");
  6. const g = Math.min(Math.round(rgb.green * 255), 255).toString(16).padStart(2, "0");
  7. const b = Math.min(Math.round(rgb.blue * 255), 255).toString(16).padStart(2, "0");
  8. return ["#", r, g, b].join("");
  9. }
  10. export function kToRgb(k: number) {
  11. if (k < 1000) {
  12. k = 1000;
  13. }
  14. if (k > 12000) {
  15. k = 12000;
  16. }
  17. const key = (Math.round(k / 50) * 50).toFixed(0);
  18. return (K_MAP as Record<string, ColorRGB>)[key];
  19. }
  20. export function xyToRgb(xy: ColorXY) {
  21. const x = (Math.round((xy.x||0) * 100) / 100);
  22. const y = (Math.round((xy.y||0) * 100) / 100);
  23. return (XY_MAP as Record<string, ColorRGB>)[`${x.toFixed(2)},${y.toFixed(2)}`];
  24. }
  25. export function hsToHsl(hs: ColorHS): string {
  26. const l=1-(hs.sat/2);
  27. const m=Math.min(l,1-l);
  28. return `hsl(${hs.hue}, ${(m?(1-l)/m:0)*100}%, ${l*100}%)`;
  29. }
  30. export function rgb2hsv (rgb: ColorRGB): ColorHS {
  31. const r = rgb.red;
  32. const g = rgb.green;
  33. const b = rgb.blue;
  34. let rabs: number, gabs: number, babs: number;
  35. let rr: number, gg: number, bb: number;
  36. let h: number = 0, s: number = 0, v: number;
  37. let diff: number;
  38. const diffc = (c: number) => (v - c) / 6 / diff + 1 / 2;
  39. const percentRoundFn = (num: number) => Math.round(num * 100) / 100;
  40. rabs = r / 255;
  41. gabs = g / 255;
  42. babs = b / 255;
  43. v = Math.max(rabs, gabs, babs),
  44. diff = v - Math.min(rabs, gabs, babs);
  45. if (diff == 0) {
  46. h = s = 0;
  47. } else {
  48. s = diff / v;
  49. rr = diffc(rabs);
  50. gg = diffc(gabs);
  51. bb = diffc(babs);
  52. if (rabs === v) {
  53. h = bb - gg;
  54. } else if (gabs === v) {
  55. h = (1 / 3) + rr - bb;
  56. } else if (babs === v) {
  57. h = (2 / 3) + gg - rr;
  58. }
  59. if (h < 0) {
  60. h += 1;
  61. } else if (h > 1) {
  62. h -= 1;
  63. }
  64. }
  65. return {
  66. hue: Math.round(h * 360),
  67. sat: s,
  68. };
  69. }