Javascript 功能“的实现;雷科洛”;

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-360)、饱和度(0-100) 我们采用初始点变换亮度(-100-0-100)并进行如下变换:


我不明白这是怎么回事?图中显示了什么?如何更改亮度?

中间线是像素值,例如从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);