【问题标题】:The implementation of functional “Recolor”功能性“重新着色”的实现
【发布时间】:2013-06-16 14:35:46
【问题描述】:

有一个任务: 图片的所有点都贴上了用户-Hue (0-360), Saturation (0-100) 我们取初始点变换Lightness(-100-0-100),变换如下:

我不明白它是关于什么的?图中显示了什么?如何改变亮度?

【问题讨论】:

    标签: javascript image canvas photoshop


    【解决方案1】:

    中间的线是像素值,例如从 0 到 255。

    上面的行显示增加了 50% 的亮度。对于 0 的输入值(中间线),它实际上会增加 50%,但是当您接近最大值 (255) 时,该值会被缩放以避免值变得 > 255。

    底线做相同但相反的方式,减去 50%。在输入值为 0 时,没有变化。只有在最大值时,您实际上才能将亮度降低 50%。

    您所指的模型是 HSL(或 HSV)模型。要调整色调、饱和度和亮度,您可以先将 RGB 模型转换为 HSL,然后调整 L 为亮度,然后再转换回来。

    我有一个带有调色板的提琴手,在这里使用它:
    http://jsfiddle.net/AbdiasSoftware/wYBEU/

    其中有两个函数,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
        }
    };
    

    HSV 转 RGB:

    function hsv2rgb(h, s, v) {
    
        h /= 60;
        s *= 0.01;
        v *= 0.01;
    
        var i = Math.floor(h);
        var f = h - i;
        var m = v * (1 - s);
        var n = v * (1 - s * f);
        var k = v * (1 - s * (1 - f));
        var rgb;
    
        switch (i) {
            case 0:
                rgb = [v, k, m];
                break;
            case 1:
                rgb = [n, v, m];
                break;
            case 2:
                rgb = [m, v, k];
                break;
            case 3:
                rgb = [m, n, v];
                break;
            case 4:
                rgb = [k, m, v];
                break;
            case 5:
            case 6:
                rgb = [v, m, n];
            break;
        }
    
        return {
            r: rgb[0] * 255 |0,
            g: rgb[1] * 255 |0,
            b: rgb[2] * 255 |0
        }
    }
    

    例子:

    假设你有这个 RGB 值 -

    Thatv 会为您提供 HSV 219、95 和 100 的亮度。

    您现在需要做的就是将亮度调整为 50 并通过 hsv2rgb 输入

    var rgb = hsv2rgb(219, 95, 50);
    

    rgbrgb.rrgb.grgb.b)现在包含调整后亮度的新 rgb 值。

    【讨论】:

    • 谢谢。我能学到更多东西吗?你把一切都解释清楚了。但是您可以详细介绍一下 Lightness 的变化吗?我怎样才能一次改变两条线?)对不起,如果这个问题很愚蠢)))我以前没有使用过图形:(
    • @GeraySuinov 当然,我在答案中添加了一个公式(从我的头顶)。像往常一样,颜色值必须介于 0 和 255 之间。亮度是介于 -1 和 1 之间的值,0 = 不调整。希望这会有所帮助。
    • @GeraySuinov 不知何故我错过了(即使我读得很清楚)您正在使用 HSL - 为此添加了流程。
    • 所以我必须转换成 HSL -> 用 L 做点什么 -> 转换成 RGB ?)
    • @GeraySuinov 正确,除非数据已经在 HSL 颜色空间中。
    猜你喜欢
    • 1970-01-01
    • 2022-11-02
    • 2015-12-28
    • 2018-12-26
    • 1970-01-01
    • 2020-03-03
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多