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.
84 lines
2.1 KiB
84 lines
2.1 KiB
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,
|
|
};
|
|
}
|