JavaScript颜色值转换的核心就是进制之间的转换。
RGB合适实际上就是十进制表示法,所以十六进制颜色值转换为RGB颜色值实际上就是十六进制转换为十进制。
在本Demo中十六进制转化为十进制比较容易一些,核心代码:
parseInt('0XFF')
其结果就是255,“0X”就表明当前十六进制 parseInt 后面无参数默认就是转换为十进制了。
十进制转换为十六进制核心代码如下:
var num = 255; num.toString(16);
其结果就是FF,16表示数值转换为十六进制
var sRgb = "RGB(23,245,56)",sHex = "#24538B"; var sHexColor = sRgb.colorHex(); var sHexColor = sHex.colorRgb();
colorHex()表示转换为十六进制
colorRgb()表示转换为十进制
Demo
$(function () { //16位颜色值转为RGB(10位) $("#color").change(function () { var sRgbColor = $(this).val().colorRgb(); $("#colorValue").val(sRgbColor); }); })
JavaScript颜色转换的核心就是进制间的转换。RGB格式其实就是十进制表示法,所以,十六进制颜色与RGB颜色的转换就是十六进制与十进制之间的转换。
十六进制转换为十进制相对容易些,核心代码如下示例:
parseInt("0xFF")
,其结果就是255,”0x”就表明当前是16进制,由于parseInt后面无参数,默认就是转换为10进制了。十进制转换为16进制,核心代码如下:
var num=255; num.toString(16);
,其结果是FF。”16″表示数值转换为16进制字符串。使用颜色转换方法
var sRgb = "RGB(23,245,56)",sHex = "#24538B"; var sHexColor = sRgb.colorHex(); var sHexColor = sHex.colorRgb();
colorHex()表示转换为十六进制
colorRgb()表示转换为十进制
说明:此JavaScript实现的一个小小原则是“以统一的形式显示”,所以十六进制缩写的颜色值(如:#333)会以#333333显示。如果转为的字符格式不匹配或是值溢出返回,则会原值返回。例如:RGB(0,0,256)会返回RGB(0,0,256),#3456会返回#3456,#egd会返回#egd。
JS
//十六进制颜色值的正则表达式 var reg = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/; /*RGB颜色转换为16进制*/ String.prototype.colorHex = function(){ var that = this; if(/^(rgb|RGB)/.test(that)){ var aColor = that.replace(/(?:\(|\)|rgb|RGB)*/g,"").split(","); var strHex = "#"; for(var i=0; i<aColor.length; i++){ var hex = Number(aColor[i]).toString(16); if(hex === "0"){ hex += hex; } strHex += hex; } if(strHex.length !== 7){ strHex = that; } return strHex; }else if(reg.test(that)){ var aNum = that.replace(/#/,"").split(""); if(aNum.length === 6){ return that; }else if(aNum.length === 3){ var numHex = "#"; for(var i=0; i<aNum.length; i+=1){ numHex += (aNum[i]+aNum[i]); } return numHex; } }else{ return that; } }; //------------------------------------------------- /*16进制颜色转为RGB格式*/ String.prototype.colorRgb = function(){ var sColor = this.toLowerCase(); if(sColor && reg.test(sColor)){ 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 sColorChange.join(","); }else{ return sColor; } };
扩展: HSL转RGB
/** * HSL颜色值转换为RGB. * 换算公式改编自 http://en.wikipedia.org/wiki/HSL_color_space. * h, s, 和 l 设定在 [0, 1] 之间 * 返回的 r, g, 和 b 在 [0, 255]之间 * * @param Number h 色相 * @param Number s 饱和度 * @param Number l 亮度 * @return Array RGB色值数值 */ function hslToRgb(h, s, l){ var r, g, b; if(s == 0){ r = g = b = l; // achromatic }else{ var hue2rgb = 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)]; }
扩展: 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 蓝色色值 * @return Array HSL各值数组 */ 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; // 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]; }