使用OP的答案提供的知识,中间值具有
new_mid = max / (r + 1) * sat + max * (1 - sat)
r = (max - mid) / (mid - min)
Can simplify...
new_mid = max / (((max - mid) / (mid - min)) + 1) * sat + max * (1 - sat)
= max * (sat / (((max - mid) / (mid - min)) + 1) + (1 - sat))
= max * ((1 - sat) + sat / (((max - mid) / (mid - min)) + ((mid - min) / (mid - min))))
= max * ((1 - sat) + sat / (((max - mid) + (mid - min)) / (mid - min)))
= max * ((1 - sat) + sat * (mid - min) / ((max - mid) + (mid - min)))
= max * ((1 - sat) + sat * (mid - min) / (max - min))
let
a = max - min
b = mid - min
=>
new_mid = max * ((1 - sat) + sat * b / a)
我已经重新编写了这个方法,不再使用 jQuery,减少了除法操作并接受更多的输入。
function saturation(rgb, s) {
var min = rgb.indexOf(Math.min.apply(null, rgb)),
max = rgb.indexOf(Math.max.apply(null, rgb)),
mid = [0, 1, 2].filter(function (i) {return i !== min && i !== max;})[0],
a = rgb[max] - rgb[min],
b = rgb[mid] - rgb[min],
x = rgb[max],
arr = [x, x, x];
if (min === max) {
min = 2;
a = 1;
}
arr[max] = x;
arr[min] = Math.round(x * (1 - s));
arr[mid] = Math.round(x * ((1 - s) + s * b / a));
return arr;
}
现在和以前一样,
saturation([52, 132, 220], 0.5);
saturation([52, 132, 220], 0);
saturation([52, 132, 220], 1);
但是也适用于具有相等部分的值
saturation([80, 80, 80], 0.5); // [80, 40, 40] vs []
改变 value 是非常容易的。
function nvalue(rgb, v) {
var x = Math.max.apply(null, rgb);
if (x === 0)
return [
Math.round(255 * v),
Math.round(255 * v),
Math.round(255 * v)
];
x = 255 * v / x;
return [
Math.round(rgb[0] * x),
Math.round(rgb[1] * x),
Math.round(rgb[2] * x)
];
}
s
不仅等于饱和度? - Daniel CheungB = 200; R = B - B * Saturation
,则可以轻松计算出 R (min) 和 B (max),但是如何在不经过色调和值的情况下知道 G 呢?您只知道R < G < B
。 - Paul S.