gpt4 book ai didi

Javascript 准确地将 HSB/HSV 颜色转换为 RGB

转载 作者:IT王子 更新时间:2023-10-29 03:10:53 26 4
gpt4 key购买 nike

我需要准确地将 HSB 转换为 RGB,但我不确定如何解决将小数转换为整数而不四舍五入的问题。这是我在颜色选择器库中的当前功能:

HSBToRGB = function (hsb) {

var rgb = { };
var h = Math.round(hsb.h);
var s = Math.round(hsb.s * 255 / 100);
var v = Math.round(hsb.b * 255 / 100);

if (s == 0) {

rgb.r = rgb.g = rgb.b = v;
} else {
var t1 = v;
var t2 = (255 - s) * v / 255;
var t3 = (t1 - t2) * (h % 60) / 60;

if (h == 360) h = 0;

if (h < 60) { rgb.r = t1; rgb.b = t2; rgb.g = t2 + t3 }
else if (h < 120) { rgb.g = t1; rgb.b = t2; rgb.r = t1 - t3 }
else if (h < 180) { rgb.g = t1; rgb.r = t2; rgb.b = t2 + t3 }
else if (h < 240) { rgb.b = t1; rgb.r = t2; rgb.g = t1 - t3 }
else if (h < 300) { rgb.b = t1; rgb.g = t2; rgb.r = t2 + t3 }
else if (h < 360) { rgb.r = t1; rgb.g = t2; rgb.b = t1 - t3 }
else { rgb.r = 0; rgb.g = 0; rgb.b = 0 }
}

return { r: Math.round(rgb.r), g: Math.round(rgb.g), b: Math.round(rgb.b) };

如您所见,此函数的不准确性来自 Math.round

最佳答案

来自 Parthik Gosarlinkthis comment稍作修改,让您独立输入每个值或作为一个对象一次性输入

/* accepts parameters
* h Object = {h:x, s:y, v:z}
* OR
* h, s, v
*/
function HSVtoRGB(h, s, v) {
var r, g, b, i, f, p, q, t;
if (arguments.length === 1) {
s = h.s, v = h.v, h = h.h;
}
i = Math.floor(h * 6);
f = h * 6 - i;
p = v * (1 - s);
q = v * (1 - f * s);
t = v * (1 - (1 - f) * s);
switch (i % 6) {
case 0: r = v, g = t, b = p; break;
case 1: r = q, g = v, b = p; break;
case 2: r = p, g = v, b = t; break;
case 3: r = p, g = q, b = v; break;
case 4: r = t, g = p, b = v; break;
case 5: r = v, g = p, b = q; break;
}
return {
r: Math.round(r * 255),
g: Math.round(g * 255),
b: Math.round(b * 255)
};
}

此代码需要 0 <= h, s, v <= 1 ,如果您使用的是度数或弧度,请记住将它们分开。

返回的0 <= r, g, b <= 255四舍五入到最接近的整数。如果您不希望出现此行为,请删除 Math.round s 来自返回的对象。


反之(划分较少)

/* accepts parameters
* r Object = {r:x, g:y, b:z}
* OR
* r, g, b
*/
function RGBtoHSV(r, g, b) {
if (arguments.length === 1) {
g = r.g, b = r.b, r = r.r;
}
var max = Math.max(r, g, b), min = Math.min(r, g, b),
d = max - min,
h,
s = (max === 0 ? 0 : d / max),
v = max / 255;

switch (max) {
case min: h = 0; break;
case r: h = (g - b) + d * (g < b ? 6: 0); h /= 6 * d; break;
case g: h = (b - r) + d * 2; h /= 6 * d; break;
case b: h = (r - g) + d * 4; h /= 6 * d; break;
}

return {
h: h,
s: s,
v: v
};
}

此代码将输出 0 <= h, s, v <= 1 , 但这次需要任何 0 <= r, g, b <= 255 (不需要是整数)


为了完整性,

function HSVtoHSL(h, s, v) {
if (arguments.length === 1) {
s = h.s, v = h.v, h = h.h;
}
var _h = h,
_s = s * v,
_l = (2 - s) * v;
_s /= (_l <= 1) ? _l : 2 - _l;
_l /= 2;

return {
h: _h,
s: _s,
l: _l
};
}

function HSLtoHSV(h, s, l) {
if (arguments.length === 1) {
s = h.s, l = h.l, h = h.h;
}
var _h = h,
_s,
_v;

l *= 2;
s *= (l <= 1) ? l : 2 - l;
_v = (l + s) / 2;
_s = (2 * s) / (l + s);

return {
h: _h,
s: _s,
v: _v
};
}

所有这些值都应该在 0 范围内至 1 .对于 HSL<->RGB 通过HSV

关于Javascript 准确地将 HSB/HSV 颜色转换为 RGB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17242144/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com