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

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,
};
}