美文网首页
JS十六进制颜色(#fff)与RGB, HSL颜色的相互转换 (

JS十六进制颜色(#fff)与RGB, HSL颜色的相互转换 (

作者: 陈情令 | 来源:发表于2021-11-05 16:35 被阅读0次

    原文出处:https://www.haorooms.com/post/color_rgb_transform

    延伸阅读:用js生成全色系调色盘的算法

    前言

    今天做了这个需求,就是前端支持rgba设置,但是后台生成图片的时候不支持rgba,需要2个值。分别是一个十六进制颜色值和一个opacity透明度,这就要我这边传值的时候,把原来的rgba转换成2个值,然后传给后台。(注,之所以前端没有分成2个字段,是因为前端设置颜色的时候直接用一个rgba设置的,这样用户体验好,分别设置颜色和透明度的话,还要分2次,对用户来说稍微有点麻烦。)

    转换方法

    转换方法其实网上搜索也能搜索到,这里暂时列一下:

    rgb转为十六进制颜色

    varcolorHex =function(color){

    varthat = color;

    //十六进制颜色值的正则表达式

    varreg =/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;

    // 如果是rgb颜色表示

    if(/^(rgb|RGB)/.test(that)) {

    varaColor = that.replace(/(?:\(|\)|rgb|RGB)*/g,"").split(",");

    varstrHex ="#";

    for(vari=0; i

    varhex =Number(aColor[i]).toString(16);

    if(hex.length<2) {

    hex ='0'+ hex;

                }

                strHex += hex;

            }

    if(strHex.length!==7) {

                strHex = that;   

            }

    returnstrHex;

    }elseif(reg.test(that)) {

    varaNum = that.replace(/#/,"").split("");

    if(aNum.length===6) {

    returnthat;

    }elseif(aNum.length===3) {

    varnumHex ="#";

    for(vari=0; i

                    numHex += (aNum[i] + aNum[i]);

                }

    returnnumHex;

            }

        }

    returnthat;

    };

    colorHex('rgb(255,255,255)')

    "#ffffff"

    十六进制颜色转为RGB

    varcolorRgb =function(sColor){

    sColor = sColor.toLowerCase();

    //十六进制颜色值的正则表达式

    varreg =/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;

    // 如果是16进制颜色

    if(sColor && reg.test(sColor)) {

    if(sColor.length===4) {

    varsColorNew ="#";

    for(vari=1; i<4; i+=1) {

    sColorNew += sColor.slice(i, i+1).concat(sColor.slice(i, i+1));

                }

                sColor = sColorNew;

            }

    //处理六位的颜色值

    varsColorChange = [];

    for(vari=1; i<7; i+=2) {

    sColorChange.push(parseInt("0x"+sColor.slice(i, i+2)));

            }

    return"RGB("+ sColorChange.join(",") +")";

        }

    returnsColor;

    };

    colorRgb("#fff")

    "RGB(255,255,255)"

    方法二: 用dom的方式

    varcolorToRgb =function(color) {

    vardiv =document.createElement('div');

    div.style.backgroundColor= color;

    document.body.appendChild(div);

    varc =window.getComputedStyle(div).backgroundColor;

    document.body.removeChild(div);

    returnc;

    };

    HSL和RGB的互转

    一、HSL转RGB

    /**

    * HSL颜色值转换为RGB.

    * 换算公式改编自 http://en.wikipedia.org/wiki/HSL_color_space.

    * h, s, 和 l 设定在 [0, 1] 之间

    * 返回的 r, g, 和 b 在 [0, 255]之间

    *

    *@paramNumber  h      色相

    *@paramNumber  s      饱和度

    *@paramNumber  l      亮度

    *@returnArray          RGB色值数值

    */

    functionhslToRgb(h, s, l) {

    varr, g, b;

    if(s ==0) {

    r = g = b = l;// achromatic

    }else{

    varhue2rgb =functionhue2rgb(p, q, t) {

    if(t <0) t +=1;

    if(t >1) t -=1;

    if(t <1/6)returnp + (q - p) *6* t;

    if(t <1/2)returnq;

    if(t <2/3)returnp + (q - p) * (2/3- t) *6;

    returnp;

            }

    varq = l <0.5? l * (1+ s) : l + s - l * s;

    varp =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)];

    }

    二、RGB转HSL

    /**

    * RGB 颜色值转换为 HSL.

    * 转换公式参考自 http://en.wikipedia.org/wiki/HSL_color_space.

    * r, g, 和 b 需要在 [0,255] 范围内

    * 返回的 h, s, 和 l 在 [0,1] 之间

    *

    * @param  Number  r      红色色值

    * @param  Number  g      绿色色值

    * @param  Number  b      蓝色色值

    * @returnArray          HSL各值数组

    */

    functionrgbToHsl(r, g, b){

    r /=255, g /=255, b /=255;

    varmax= Math.max(r, g, b),min= Math.min(r, g, b);

    var h, s, l = (max+min) /2;

    if(max==min){

    h = s =0; // achromatic

    }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, s, l];

    }

    rgba转化为2个值得方法

      watch: {

    'background'(val) {

    // 转换成2个字段,用了比较笨的办法转吧

    let tempval =val.replace('rgba(','').replace(')','').split(',')

    this.$set(this.haorooms.data,'background', {})

    this.$set(this.haorooms.data.background,'color', `rgb(${tempval[0]},${tempval[1]},${tempval[2]})`)

    this.$set(this.haorooms.data.background,'opacity', tempval[3])

        }

      }

    2个值转为RGBA的方法(回填需要)

    if(this.haorooms.data.background) {

    let color =this.colorToRgb(this.templateData.data.background.color)// 上面列举的方法

    let tempval = color.replace('rgb(','').replace(')','').split(',')

    tempval.push(this.templateData.data.background.opacity)

    this.background = `rgba(${tempval.join(',')})`

    }

    相关文章

      网友评论

          本文标题:JS十六进制颜色(#fff)与RGB, HSL颜色的相互转换 (

          本文链接:https://www.haomeiwen.com/subject/nwurzltx.html