Javascript 功能“的实现;雷科洛”;
有一项任务: 用户粘贴的图片的所有点色调(0-360)、饱和度(0-100) 我们采用初始点变换亮度(-100-0-100)并进行如下变换:Javascript 功能“的实现;雷科洛”;,javascript,image,canvas,photoshop,Javascript,Image,Canvas,Photoshop,有一项任务: 用户粘贴的图片的所有点色调(0-360)、饱和度(0-100) 我们采用初始点变换亮度(-100-0-100)并进行如下变换: 我不明白这是怎么回事?图中显示了什么?如何更改亮度?中间线是像素值,例如从0到255 上一行显示增加50%的亮度。对于输入值0(中间线),它实际上将增加50%,但当您接近最大值(255)时,该值将被缩放以避免值变为>255 底线是相同的,但方向相反,减去50%。输入值为0时,没有变化。只有在最大值时,您才能将亮度降低50% 您所指的模型是HSL(或HSV
我不明白这是怎么回事?图中显示了什么?如何更改亮度?中间线是像素值,例如从0到255 上一行显示增加50%的亮度。对于输入值0(中间线),它实际上将增加50%,但当您接近最大值(255)时,该值将被缩放以避免值变为>255 底线是相同的,但方向相反,减去50%。输入值为0时,没有变化。只有在最大值时,您才能将亮度降低50% 您所指的模型是HSL(或HSV)模型。要调整色调、饱和度和亮度,可以先将RGB模型转换为HSL,然后调整亮度L,然后再转换回HSL 我有一个小提琴手,他的调色板在这里使用:
其中有两个函数,
rgb2hsv()
和hsv2rgb
,显示了数学:
该过程将是rgb2hsv->adjust L->hsv2rgb
(除非您可以直接使用HSL)
RGB至HSV:
function rgb2hsv() {
var rr, gg, bb,
r = arguments[0] / 255,
g = arguments[1] / 255,
b = arguments[2] / 255,
h, s,
v = Math.max(r, g, b),
diff = v - Math.min(r, g, b),
diffc = function (c) {
return (v - c) / 6 / diff + 0.5;
};
if (diff === 0) {
h = s = 0;
} else {
s = diff / v;
rr = diffc(r);
gg = diffc(g);
bb = diffc(b);
if (r === v) {h = bb - gg}
else if (g === v) {h = (0.3333333333) + rr - bb}
else if (b === v) {h = (0.6666666667) + gg - rr};
if (h < 0) {h += 1}
else if (h > 1) {h -= 1}
}
return {
h: h * 360,
s: s * 100,
v: v * 100
}
};
例如:
假设你有这个RGB值-
那辆车会给你219、95和100号HSV的卢马
您现在需要做的就是将luma调整到,比如说50,并通过hsv2rgb将其输入
var rgb = hsv2rgb(219, 95, 50);
rgb
(rgb.r
,rgb.g
,rgb.b
)现在包含带有调整luma的新rgb值。Thnx。我能学到更多吗?你把一切都解释清楚了。但是你可以详细介绍一下亮度的变化吗?我怎么能一次沿着两条线改变呢?)对不起,如果这个问题很愚蠢的话。)我以前没有使用过图形:(@GeraySuinov当然,我在答案中添加了一个公式(从头顶开始)。颜色值必须像往常一样介于0和255之间。亮度是介于-1和1之间的值,0=无需调整。希望这能有所帮助。@GeraySuinov不知何故我错过了(即使我读得很清楚)您使用的是HSL-添加的过程。因此我必须转换为HSL->使用L做点什么->转换为toRGB?@GeraySuinov正确,除非数据已经在HSL颜色空间中。
var rgb = hsv2rgb(219, 95, 50);