核心思路

JavaScript颜色转换的核心就是进制间的转换。RGB格式其实就是十进制表示法,所以,十六进制颜色与RGB颜色的转换就是十六进制与十进制之间的转换。

数学计算方法

通常在数学上进行转换时,10进制转化为16进制时,只需要将的三原色数值除以16,第一位是商,第二位是余数。超过9的用字母表示,10对应A,11对应B,12对应C,13对应D,14对应E,15对应F。

例如:

RGB(169,245,8)R:169/16=10余9,而10对应A,即 A9G:245/16=15余5, 而15对应F,即 F5B:8/16=0余8,即08所以RGB(169,245,8)=#A9F508

16进制转10进制则做乘法,RGB的数值是16乘以HEX的第一位加上HEX的第二位,数字10以下的RGB和HEX都是相同的,但需要在前面补0成两位数,10对应A,11对应B,12对应C,13对应D,14对应E,15对应F。

例如:

#A9F508=RGB(16*10+9,16*15+5,16*0+8)=RGB(169,245,8)

javascript自带转换方法

十六进制转换为十进制相对容易些,核心代码如下示例:

parseInt("0xFF")

其结果就是255,”0x”就表明当前是16进制,由于parseInt后面无参数,默认就是转换为10进制了。

十进制转换为16进制,核心代码如下:

var num=255; num.toString(16);

其结果是FF。”16″表示数值转换为16进制字符串。

RGB转换为Hex实现代码

String.prototype.RGB2Hex = function(){
    var _this = this;
    // 如果是rgb颜色表示
    if (/^(rgb|RGB)/.test(_this)) {
        var rgb = _this.split(',');
        var r = parseInt(rgb[0].split('(')[1]);
        var g = parseInt(rgb[1]);
        var b = parseInt(rgb[2].split(')')[0]);
        return "#" + r.toString(16) + g.toString(16) + b.toString(16);
    }else{
        throw  new Error("不是RGB颜色")
    }

}

Hex转换为RGB实现代码

String.prototype.colorRgb = function(){
    var sColor = this.toLowerCase();
    //十六进制颜色值的正则表达式
    var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
    // 如果是16进制颜色
    if (sColor && reg.test(sColor)) {
        //如果为#333这样的形式
        if (sColor.length === 4) {
            var sColorNew = "#";
            for (var i=1; i<4; i+=1) {
                sColorNew += sColor.slice(i, i+1).concat(sColor.slice(i, i+1));    
            }
            sColor = sColorNew;
        }
        //处理六位的颜色值
        var sColorChange = [];
        for (var i=1; i<7; i+=2) {
            sColorChange.push(parseInt("0x"+sColor.slice(i, i+2)));    
        }
        return "RGB(" + sColorChange.join(",") + ")";
    }
    return sColor;
};