|
|
import type { ColorHS, ColorRGB, ColorXY } from "$lib/models/color";
import XY_MAP from "./color-xy.json"; import K_MAP from "./color-k.json";
export function rgbToHex(rgb: ColorRGB): string { const r = Math.min(Math.round(rgb.red * 255), 255).toString(16).padStart(2, "0"); const g = Math.min(Math.round(rgb.green * 255), 255).toString(16).padStart(2, "0"); const b = Math.min(Math.round(rgb.blue * 255), 255).toString(16).padStart(2, "0"); return ["#", r, g, b].join(""); }
export function kToRgb(k: number) { if (k < 1000) { k = 1000; } if (k > 12000) { k = 12000; }
const key = (Math.round(k / 50) * 50).toFixed(0);
return (K_MAP as Record<string, ColorRGB>)[key]; }
export function xyToRgb(xy: ColorXY) { const x = (Math.round((xy.x||0) * 100) / 100); const y = (Math.round((xy.y||0) * 100) / 100);
return (XY_MAP as Record<string, ColorRGB>)[`${x.toFixed(2)},${y.toFixed(2)}`]; }
export function hsToHsl(hs: ColorHS): string { const l=1-(hs.sat/2); const m=Math.min(l,1-l);
return `hsl(${hs.hue}, ${(m?(1-l)/m:0)*100}%, ${l*100}%)`; }
export function rgb2hsv (rgb: ColorRGB): ColorHS { const r = rgb.red; const g = rgb.green; const b = rgb.blue;
let rabs: number, gabs: number, babs: number; let rr: number, gg: number, bb: number; let h: number = 0, s: number = 0, v: number; let diff: number;
const diffc = (c: number) => (v - c) / 6 / diff + 1 / 2; const percentRoundFn = (num: number) => Math.round(num * 100) / 100;
rabs = r / 255; gabs = g / 255; babs = b / 255; v = Math.max(rabs, gabs, babs), diff = v - Math.min(rabs, gabs, babs); if (diff == 0) { h = s = 0; } else { s = diff / v; rr = diffc(rabs); gg = diffc(gabs); bb = diffc(babs);
if (rabs === v) { h = bb - gg; } else if (gabs === v) { h = (1 / 3) + rr - bb; } else if (babs === v) { h = (2 / 3) + gg - rr; } if (h < 0) { h += 1; } else if (h > 1) { h -= 1; } }
return { hue: Math.round(h * 360), sat: s, }; }
|