RGB转HSL,HSL转RGB

其中的逻辑没搞懂,以下方法绝大部分颜色转换没问题,有问题的一般都是某个色值会相差一点,视觉上看不出来。

RGB转HSL,参数取值[0,255],返回值除第一个,都是百分值

function rgbToHsl(r, g, b) {
    r /= 255, g /= 255, b /= 255;
    var max = Math.max(r, g, b),
        min = Math.min(r, g, b);
    var h, s, l = (max + min) / 2;

    if (max == min) {
        h = s = 0;
    } else {
        var d = max - min;
        s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
        switch (max) {
            case r:
                h = (g - b) / d + (g < b ? 6 : 0);
                break;
            case g:
                h = (b - r) / d + 2;
                break;
            case b:
                h = (r - g) / d + 4;
                break;
        }
        h /= 6;
    }

    return [h * 360, s * 100, l * 100];
}
console.log(rgbToHsl(250, 110, 200))

HSL转RGB,参数取值,第一个[0,360],二三[0,1]

function hslToRgb(h, s, l) {
    h = h / 360;
    var r, g, b;

    if (s == 0) {
        r = g = b = l;
    } else {
        function hue2rgb(p, q, t) {
            if (t < 0) t += 1;
            if (t > 1) t -= 1;
            if (t < 1 / 6) return p + (q - p) * 6 * t;
            if (t < 1 / 2) return q;
            if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
            return p;
        }

        var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
        var p = 2 * l - q;
        r = hue2rgb(p, q, h + 1 / 3);
        g = hue2rgb(p, q, h);
        b = hue2rgb(p, q, h - 1 / 3);
    }

    return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
}
console.log(hslToRgb(240, 1, 0.5))
var hslToRgb = function(hue, saturation, lightness) {
    if (hue == undefined) {
        return [0, 0, 0];
    }

    var chroma = (1 - Math.abs((2 * lightness) - 1)) * saturation;
    var huePrime = hue / 60;
    var secondComponent = chroma * (1 - Math.abs((huePrime % 2) - 1));

    huePrime = Math.floor(huePrime);
    var red;
    var green;
    var blue;

    if (huePrime === 0 || huePrime === 6) {
        red = chroma;
        green = secondComponent;
        blue = 0;
    } else if (huePrime === 1) {
        red = secondComponent;
        green = chroma;
        blue = 0;
    } else if (huePrime === 2) {
        red = 0;
        green = chroma;
        blue = secondComponent;
    } else if (huePrime === 3) {
        red = 0;
        green = secondComponent;
        blue = chroma;
    } else if (huePrime === 4) {
        red = secondComponent;
        green = 0;
        blue = chroma;
    } else if (huePrime === 5) {
        red = chroma;
        green = 0;
        blue = secondComponent;
    }

    var lightnessAdjustment = lightness - (chroma / 2);
    red += lightnessAdjustment;
    green += lightnessAdjustment;
    blue += lightnessAdjustment;

    return [Math.round(red * 255), Math.round(green * 255), Math.round(blue * 255)];

}
console.log(hslToRgb(240, 1, 0.5))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数码印花图案的色彩模式 对于数码印花,还有很多的原理不是半个月一个月可以弄精通的,想要在数码印花行业成为工程师级别...
    金练阅读 9,006评论 0 4
  • By Future-tech 序章 这是一个阴天。 如果是在现在,我肯定会认为这是一个下海去观景的好机会。大海翻腾...
    Future_tech阅读 4,544评论 0 1
  • 原贴显示器吧 ★显示器各项参数★ ★分析科普★ 在计算机硬件上显示器算是比较容易受轻视且关注度不高的硬件,很多人对...
    卡皮阅读 10,963评论 2 11
  • 常用 注意区分大小写 带空格的字体记得加引号 使用背景图的时候最好指定背景色,这样至少能保证背景图加载出现问题时文...
    涛涛抄书阅读 3,203评论 0 0
  • 手袋行业的发展前景 Todywu2017-3-3 市场越淡机会越大!如今的市场,绝大部分朋友看到都觉得不好做,于是...
    todywu阅读 11,563评论 0 52