【发布时间】:2019-04-30 12:52:25
【问题描述】:
我已经使用我在Wikipedia 上找到的公式构建了一个将 RGB 转换为 HSV 的函数。虽然输出中的数字看起来是正确的,但它们的位置会根据哪个更大而不断变化。
例子:
Given HSV: [204, 100, 94]
Expected RGB: [ 0, 144, 240]
Output RGB: [240, 0, 144]
Given HSV: [240, 100, 94]
Expected RGB: [ 0, 0, 240]
Output RGB: [240, 0, 0]
Given HSV: [120, 100, 94]
Expected RGB: [ 0, 240, 0]
Output RGB: [240, 0, 0]
只有这个是正确的,因为红色恰好是最大的数字:
Given HSV: [ 0, 100, 94]
Expected RGB: [240, 0, 0]
Output RGB: [240, 0, 0]
函数如下:
function hsvRGB(h, s, v) {
h /= 60, s /= 100, v /= 100; // Convert [deg, %, %] to ranges 0-6, 0-1, 0-1
var r, g, b; // Set up for later
var r1, g1, b1; // Set up for later
var c = v*s; // Chroma
var x = c*(1-Math.abs(h%2-1));
if ( h <= 0 ) [r1, g1, b1] = [0, 0, 0];
if ( 0 <= h <= 1 ) [r1, g1, b1] = [c, x, 0];
if ( 1 < h <= 2 ) [r1, g1, b1] = [x, c, 0];
if ( 2 < h <= 3 ) [r1, g1, b1] = [0, c, x];
if ( 3 < h <= 4 ) [r1, g1, b1] = [0, x, c];
if ( 4 < h <= 5 ) [r1, g1, b1] = [x, 0, c];
if ( 5 < h <= 6 ) [r1, g1, b1] = [c, 0, x];
var m = v-c;
[r, g, b] = [r1 + m, g1 + m, b1 + m];
return [r*255, g*255, b*255]; // Output 0-255 instead of 0-1
}
我一直在根据 Wikipedia 上的公式检查并重新检查我的函数,但我看不到它所做的任何我看不到的事情,但我已经研究了很长时间,以至于我可能只是需要第二双眼睛。
【问题讨论】:
-
0 <= h <= 1没有做它看起来可能做的事情。你想要0 <= h && h <= 1 -
你不能在那里也使用
if..else if吗?这样你就不需要第一次检查了 -
@Pointy Dang,
0 <= h <= 1在我单独测试时似乎有效,但我想我测试得不够彻底。你是对的。 @George我不确定我还会使用什么。他们都不是else。 -
@TanzNukeTerror 我的意思是做
if(h <= o){} else if (h <=1){} etc然后你就不需要第一部分0 <= h因为如果是这样的话它会被前一个块捕获 -
@George 哦,我明白了,我以为你的意思是“你不能”就像“你在不应该使用的时候使用它”,我的错。维基百科上的公式大多是直接转换的。一旦它正常工作,我将继续努力。
标签: javascript colors rgb hsv