js 中RGB十六进制码补色算法及实现 by shawl.qiu
2007-06-16 00:50
656 查看
js 中RGB十六进制码补色算法及实现 by shawl.qiu
说明:首先要明白, 什么是 RGB, RGB 分别是Red, Green, Blue 的英文缩写.
希望更深入了解请查阅相关资料.
Web 中 RGB 分别是 0-255 的值所表示的.
RGB = (0-255)(0-255)(0-255), 单独表示:
R = 255 0 0
G = 0 255 0
B = 0 0 255
白色 = 255 255 255
黑色 = 0 0 0
RGB 十六进制码为 六个0-9a-f 组成的颜色代码
(0-9a-f)(0-9a-f)(0-9a-f)(0-9a-f)(0-9a-f)(0-9a-f)
如:
ffffff, 000000
对应于RGB 依次为每二个代码对应 RGB 一个
如: 00CCFF
00 = R
CC = G
FF = B
也可以是三个 0-9a-f, 但每一个代表着重复一次 本身
(0-9a-f)(0-9a-f)(0-9a-f)
如:
fff = ffffff
000 = 000000
0f0 = 00ff00
依次对应于 RGB
什么是补色呢?
希望更深入了解请查阅相关资料.
在 RGB 颜色空间中, 补色的意思就是两个颜色相加得到 白色的话, 就是补色.
如:
白色(RGB: 255 255 255) 的补色是黑色(RGB: 0 0 0)
白色(十六进制: FFFFFF) 的补色是黑色((十六进制: 000000)
现在描述 取 RGB十六进制码 补色 操作:
假如有 RGB十六进制码 FF0000, 如何取补色呢?
首先把 FF0000 分为 FF, 00, 00, 即三个部分, 方便对应于RGB.
再把上面的三部分转为十进制, 即 255, 0, 0
然后再使用 255 分别减去十进制的三部分, 即 0, -255, -255
再取绝对值, 得到 0, 255, 255
再把上面的绝对值三部分转为十六进制, 即: 00, ff, ff
取补完成, 怎么样, 很简单吧...
后语:
取补色是设计中常用到的一种技巧, 我弄这个的主要原因是使用随机颜色,
生成背景色和前景色, 希望可以清晰辨认, 最好的方法就是使用取补色.
比如已知背景色 X, 我就可以从X 得到X的补色做为前景色, 从而达到清晰辩认.
目录:
1. JS 取补色函数 fGetCompColor 及相关演示(fGetCompColor.htm)
shawl.qiu
2007-06-16
http://blog.csdn.net/btbtd
下载: http://files.myopera.com/btbtd/javascript/function/fGetCompColor.7z
演示: http://files.myopera.com/btbtd/javascript/function/fGetCompColor.htm
内容:
1. JS 取补色函数 fGetCompColor 及相关演示(fGetCompColor.htm)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- DW6 -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>shawl.qiu template</title>
<script type="text/javascript">
//<![CDATA[
document.write("<p/><hr/><p/>预定颜色: <p/>");
var arTest = [];
// 红色系
arTest[0] = "#CF0070";
arTest[1] = "#D70040";
arTest[2] = "#C80852";
arTest[3] = "#E61C64";
arTest[4] = "#DC5B6F";
arTest[5] = "#EE869A";
arTest[6] = "#F09192";
arTest[7] = "#E198C0";
arTest[8] = "#F19C9F";
arTest[9] = "#F5B2B2";
arTest[10] = "#F7C8CF";
arTest[11] = "#F8C6B5";
arTest[12] = "#FCE5DF";
arTest[13] = "#F29B87";
arTest[14] = "#E60012";
arTest[15] = "#D8000F";
arTest[16] = "#A40027";
arTest[17] = "#66192D";
arTest[18] = "#C2737F";
// 橙色系
arTest[19] = "#EA5520";
arTest[20] = "#ED6E3D";
arTest[21] = "#C80852";
arTest[22] = "#F18D00";
arTest[23] = "#F39839";
arTest[24] = "#F9C270";
arTest[25] = "#E5A96B";
arTest[26] = "#ECD6CA";
arTest[27] = "#E3CCA9";
arTest[28] = "#D3B78F";
arTest[29] = "#B58654";
arTest[30] = "#6A3315";
arTest[31] = "#713B12";
arTest[32] = "#694B23";
// 黄色系
arTest[33] = "#F7AB00";
arTest[34] = "#FDD000";
arTest[35] = "#FFD700";
arTest[36] = "#FEDD78";
arTest[37] = "#FFEAB4";
arTest[38] = "#EBE5D1";
arTest[39] = "#FFF8B1";
arTest[40] = "#FFF463";
arTest[41] = "#FFFF00";
arTest[42] = "#FFF100";
arTest[43] = "#EDD443";
arTest[44] = "#D6C560";
arTest[45] = "#C48F00";
arTest[46] = "#999999";
arTest[47] = "#FDFDFD";
// 绿色系
arTest[48] = "#C4D700";
arTest[49] = "#9EBD19";
arTest[50] = "#A9D06B";
arTest[51] = "#87A256";
arTest[52] = "#AAC468";
arTest[53] = "#888637";
arTest[54] = "#625A05";
arTest[55] = "#3D7D53";
arTest[56] = "#6ABD78";
arTest[57] = "#15AE69";
arTest[58] = "#42AB91";
arTest[59] = "#7BB99B";
arTest[60] = "#006550";
arTest[61] = "#008E57";
arTest[62] = "#008077";
// 青蓝色系
arTest[63] = "#B0DCD5";
arTest[64] = "#A1D8E6";
arTest[65] = "#59C3E2";
arTest[66] = "#22AEE6";
arTest[67] = "#94C6D0";
arTest[68] = "#B1D4DB";
arTest[69] = "#8BB0CD";
arTest[70] = "#4C8DB5";
arTest[71] = "#2983B1";
arTest[72] = "#00A4C5";
arTest[73] = "#008890";
arTest[74] = "#006980";
arTest[75] = "#007BBB";
arTest[76] = "#005DAC";
arTest[77] = "#004098";
arTest[78] = "#1E50A2";
// 蓝色系
arTest[79] = "#F0F8FF";
arTest[80] = "#007FFF";
arTest[81] = "#0000FF";
arTest[82] = "#007BA7";
arTest[83] = "#2A52BE";
arTest[84] = "#0047AB";
arTest[85] = "#6495ED";
arTest[86] = "#0000C8";
arTest[87] = "#1560BD";
arTest[88] = "#1E90FF";
arTest[89] = "#4B0082";
arTest[90] = "#002FA7";
arTest[91] = "#BDBBD7";
arTest[92] = "#003366";
arTest[93] = "#000080";
arTest[94] = "#CCCCFF";
arTest[95] = "#32127A";
arTest[96] = "#B0E0E6";
arTest[97] = "#003153";
arTest[98] = "#4169E1";
arTest[99] = "#082567";
arTest[100] = "#4682B4";
arTest[101] = "#120A8F";
arTest[102] = "#ADD8E6";
// 靛青色系
arTest[103] = "#5B77AF";
arTest[104] = "#6684B0";
arTest[105] = "#134098";
arTest[106] = "#527AA3";
arTest[107] = "#005789";
arTest[108] = "#005178";
arTest[109] = "#005978";
arTest[110] = "#00456B";
arTest[111] = "#001954";
arTest[112] = "#002E5A";
arTest[113] = "#38426A";
arTest[114] = "#04163A";
// 紫色系
arTest[115] = "#735B9F";
arTest[116] = "#7C509D";
arTest[117] = "#D8BFCB";
arTest[118] = "#BBA1CB";
arTest[119] = "#A688B1";
arTest[120] = "#7E4985";
arTest[121] = "#923D92";
arTest[122] = "#6F196F";
arTest[123] = "#C5AFC0";
arTest[124] = "#8B0062";
arTest[125] = "#D369A4";
arTest[126] = "#D188A8";
arTest[127] = "#D188A8";
arTest[128] = "#EDE0E6";
arTest[129] = "#9D899D";
// 灰色系
arTest[130] = "#FFFFFF";
arTest[131] = "#E6E6E6";
arTest[132] = "#CCCCCC";
arTest[133] = "#B3B3B3";
arTest[134] = "#999999";
arTest[135] = "#808080";
arTest[136] = "#666666";
arTest[137] = "#4D4D4D";
arTest[138] = "#1A1A1A";
arTest[139] = "#000000";
var iCount = 0;
var iLen = arTest.length;
while(iCount<iLen)
{
/*
fTest(fGetCompColor(arTest[iCount]), arTest[iCount]);
document.write("<li/>FgColor: "+arTest[iCount]+" | BgColor: "+fGetCompColor(arTest[iCount]));
*/
fTest(arTest[iCount], fGetCompColor(arTest[iCount]));
document.write("<li/>BgColor: "+arTest[iCount]+" | FgColor: "+fGetCompColor(arTest[iCount]));
//document.write("<p/>");
iCount++;
}
document.write("<p/><hr/><p/>随机颜色: <p/>");
var iCount = 0;
var iLen = 100;
while(iCount<iLen)
{
var MyColor = "#"+fRndCor(0, 255, true);
fTest(MyColor, fGetCompColor(MyColor));
document.write("<li/>BgColor: "+MyColor+" | FgColor: "+fGetCompColor(MyColor));
//document.write("<p/>");
iCount++;
}
function fGetCompColor(sInput, sOpt, bNoSharp, bDebug)
{// shawl.qiu script
if(!sInput) sInput = "#000000";
if(!sOpt) sOpt = 'hex';
sOpt = sOpt.toLowerCase();
var arCell = [];
var arHex = [];
var arHexFinal = [];
var arInt = [];
var arIntFinal = [];
var Debug = bDebug;
if(Debug)
{
alert
(
"sInput: "+sInput
+" sOpt: "+sOpt
);
}
sInput = sInput.replace(/^/#/, "");
switch(sOpt)
{
case "rgb":
break;
default:
if(sInput.length==3)
{
var arTemp = fStringToArray(sInput);
sInput = ""+arTemp[0]+arTemp[0]+arTemp[1]+arTemp[1]+arTemp[2]+arTemp[2];
}
if(sInput.length==6)
{
arCell = fStringToArray(sInput);
arHex[0] = "0x"+arCell[0]+arCell[1];
arHex[1] = "0x"+arCell[2]+arCell[3];
arHex[2] = "0x"+arCell[4]+arCell[5];
arInt[0] = parseInt(arHex[0], 16);
arInt[1] = parseInt(arHex[1], 16);
arInt[2] = parseInt(arHex[2], 16);
arIntFinal[0] = Math.abs(255-arInt[0]);
arIntFinal[1] = Math.abs(255-arInt[1]);
arIntFinal[2] = Math.abs(255-arInt[2]);
arHexFinal[0] = fPadStr(arIntFinal[0].toString(16)).toUpperCase();
arHexFinal[1] = fPadStr(arIntFinal[1].toString(16)).toUpperCase();
arHexFinal[2] = fPadStr(arIntFinal[2].toString(16)).toUpperCase();
if(Debug)
{
alert("arCell: "+arCell);
alert("arHex: "+arHex);
alert("arInt: "+arInt);
alert("arIntFinal: "+arIntFinal);
alert("arHexFinal: "+arHexFinal);
}
if(bNoSharp) return arHexFinal.join("");
return "#"+arHexFinal.join("");
}
else
{
alert("无法识别的十六进制颜色代码!");
}
break;
}
return "000000";
function fStringToArray(sInput)
{// shawl.qiu script
var arCell = [];
var iCount = 0;
var iLen = sInput.length;
while(iCount<iLen)
{
arCell[iCount] = sInput.charAt(iCount);
iCount++;
}
return arCell;
} // end function fStringToArray
function fPadStr(sSrc, sPad, nLen)
{// shawl.qiu script
if(!sSrc)return false;
if(!sPad)sPad='0';
if(!nLen)nLen=2;
sSrc+='';
if(sSrc.length>=nLen)return sSrc;
sPad=new Array(nLen+1).join(sPad);
var re=new RegExp('.*(.{'+(nLen)+'})$');
return (sPad+sSrc).replace(re,'$1');
} // end function fPadStr
} // end function fGetCompColor
function fRndCor(under, over, bNoPadSymbol)
{// shawl.qiu code
if(arguments.length==1)
{
var over=under;
under=0;
}
else if(arguments.length==0)
{
var under=0;
var over=255;
} // end if
var r=fRandomBy(under, over).toString(16);
r=fStrPadStr(r, r, 2);
var g=fRandomBy(under, over).toString(16);
g=fStrPadStr(g, g, 2);
var b=fRandomBy(under, over).toString(16);
b=fStrPadStr(b, b, 2);
//defaultStatus=r+' '+g+' '+b
if(bNoPadSymbol) return (""+r+g+b).toUpperCase();
return '#'+(r+g+b).toUpperCase()+';';
function fRandomBy(under, over)
{// shawl.qiu code
switch(arguments.length)
{
case 1: return parseInt(Math.random()*under+1);
case 2: return parseInt(Math.random()*(over-under+1) + under);
default: return 0;
} // end switch
} // end function fRandomBy
function fStrPadStr(sSrc, sPad, nLen)
{
if(!sSrc)return false;
if(!sPad)sPad='0';
if(!nLen)nLen=2;
sSrc+='';
if(sSrc.length>=nLen)return sSrc;
sPad=new Array(nLen+1).join(sPad);
var re=new RegExp('.*(.{'+(nLen)+'})$');
return (sPad+sSrc).replace(re,'$1');
} // end function fStrPadStr
} // end function fRndCor
function fTest(sBgColor, sFgColor)
{
document.write
(
'<div style=" color:'+sFgColor
+'; background-color:'+sBgColor+'; font-size:18px;">补色测试, Complementary Color test.</div>'
);
} // end function fTest
//]]>
</script>
</head>
<body>
</body>
</html>
相关文章推荐
- Javascript N层对称标记算法的实现 By shawl.qiu
- js prototype 格式化数字 By shawl.qiu
- ASP VBScript 动态包含文件, FSO 实现 By Shawl.qiu
- ASP 二进制与字符串互转, 另类完美解决方法, adodb.stream 实现 By shawl.qiu
- 在.net 1.x 中, 实现多语言功能, by shawl.qiu
- CSS 弹出菜单, 完美实现, 完美兼容 By shawl.qiu
- 使用 js + button标签 模拟 select 列表框 操作 By shawl.qiu
- ASP 无重复数字随机函数, 数组实现, 并应用于随机显示记录集 By shawl.qiu
- 编写纯 CSS 弹出菜单的原理及实现 By shawl.qiu
- ASP 通用文章分页函数(非记录集分页), 返回多个结果, 字典实现 By shawl.qiu
- Javascript 单数组实现列表框两级联动三级联动 By shawl.qiu
- 编写纯 CSS 弹出菜单的原理及实现 By shawl.qiu
- 无限级菜单结构 与 Javascript 实现算法, 类 XMenu by shawl.qiu
- JScript 中 eval 实现 VBScript ExecuteGlobal 功能, 函数 fExecuteGlobal by shawl.qiu
- 使用IE条件注释 实现兼容 IE, Opera, Firefox 的 DIV+CSS 表格布局 By shawl.qiu
- 编写纯 CSS 弹出菜单的原理及实现 By shawl.qiu
- javascript 简单高效判断数据类型 系列函数 By shawl.qiu
- sqEditor HTML 编辑器 v1.3 By shawl.qiu
- Javascript prototype 格式化日期 By shawl.qiu
- 使用 javascript 函数 完美控制页面图片显示大小 By shawl.qiu