js 中RGB十六进制码补色算法及实现 by shawl.qiu

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)
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <!-- DW6 -->
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <title>shawl.qiu template</title>
  7. <script type="text/javascript">
  8. //<![CDATA[
  9.  document.write("<p/><hr/><p/>预定颜色: <p/>");
  10.   
  11.  var arTest = [];
  12.   // 红色系
  13.   arTest[0] = "#CF0070";
  14.   arTest[1] = "#D70040";
  15.   arTest[2] = "#C80852";
  16.   arTest[3] = "#E61C64";
  17.   arTest[4] = "#DC5B6F";
  18.   arTest[5] = "#EE869A";
  19.   arTest[6] = "#F09192";
  20.   arTest[7] = "#E198C0";
  21.   arTest[8] = "#F19C9F"; 
  22.   arTest[9] = "#F5B2B2"; 
  23.   arTest[10] = "#F7C8CF"; 
  24.   arTest[11] = "#F8C6B5"; 
  25.   arTest[12] = "#FCE5DF"; 
  26.   arTest[13] = "#F29B87"; 
  27.   arTest[14] = "#E60012"; 
  28.   arTest[15] = "#D8000F"; 
  29.   arTest[16] = "#A40027"; 
  30.   arTest[17] = "#66192D"; 
  31.   arTest[18] = "#C2737F";
  32.    
  33.   // 橙色系
  34.   arTest[19] = "#EA5520"; 
  35.   arTest[20] = "#ED6E3D"; 
  36.   arTest[21] = "#C80852"; 
  37.   arTest[22] = "#F18D00"; 
  38.   arTest[23] = "#F39839"; 
  39.   arTest[24] = "#F9C270"; 
  40.   arTest[25] = "#E5A96B"; 
  41.   arTest[26] = "#ECD6CA"; 
  42.   arTest[27] = "#E3CCA9"; 
  43.   arTest[28] = "#D3B78F"; 
  44.   arTest[29] = "#B58654"; 
  45.   arTest[30] = "#6A3315"; 
  46.   arTest[31] = "#713B12"; 
  47.   arTest[32] = "#694B23"; 
  48.   
  49.   // 黄色系
  50.   arTest[33] = "#F7AB00"; 
  51.   arTest[34] = "#FDD000"; 
  52.   arTest[35] = "#FFD700"; 
  53.   arTest[36] = "#FEDD78"; 
  54.   arTest[37] = "#FFEAB4"; 
  55.   arTest[38] = "#EBE5D1"; 
  56.   arTest[39] = "#FFF8B1"; 
  57.   arTest[40] = "#FFF463"; 
  58.   arTest[41] = "#FFFF00"; 
  59.   arTest[42] = "#FFF100"; 
  60.   arTest[43] = "#EDD443"; 
  61.   arTest[44] = "#D6C560"; 
  62.   arTest[45] = "#C48F00"; 
  63.   arTest[46] = "#999999"; 
  64.   arTest[47] = "#FDFDFD"; 
  65.   
  66.   // 绿色系
  67.   arTest[48] = "#C4D700"; 
  68.   arTest[49] = "#9EBD19"; 
  69.   arTest[50] = "#A9D06B"; 
  70.   arTest[51] = "#87A256"; 
  71.   arTest[52] = "#AAC468"; 
  72.   arTest[53] = "#888637"; 
  73.   arTest[54] = "#625A05"; 
  74.   arTest[55] = "#3D7D53"; 
  75.   arTest[56] = "#6ABD78"; 
  76.   arTest[57] = "#15AE69"; 
  77.   arTest[58] = "#42AB91"; 
  78.   arTest[59] = "#7BB99B"; 
  79.   arTest[60] = "#006550"; 
  80.   arTest[61] = "#008E57"; 
  81.   arTest[62] = "#008077"; 
  82.   
  83.   // 青蓝色系
  84.   arTest[63] = "#B0DCD5"; 
  85.   arTest[64] = "#A1D8E6"; 
  86.   arTest[65] = "#59C3E2"; 
  87.   arTest[66] = "#22AEE6"; 
  88.   arTest[67] = "#94C6D0"; 
  89.   arTest[68] = "#B1D4DB"; 
  90.   arTest[69] = "#8BB0CD"; 
  91.   arTest[70] = "#4C8DB5"; 
  92.   arTest[71] = "#2983B1"; 
  93.   arTest[72] = "#00A4C5"; 
  94.   arTest[73] = "#008890"; 
  95.   arTest[74] = "#006980"; 
  96.   arTest[75] = "#007BBB"; 
  97.   arTest[76] = "#005DAC"; 
  98.   arTest[77] = "#004098"; 
  99.   arTest[78] = "#1E50A2"; 
  100.   
  101.   // 蓝色系
  102.   arTest[79] = "#F0F8FF"; 
  103.   arTest[80] = "#007FFF"; 
  104.   arTest[81] = "#0000FF"; 
  105.   arTest[82] = "#007BA7"; 
  106.   arTest[83] = "#2A52BE"; 
  107.   arTest[84] = "#0047AB"; 
  108.   arTest[85] = "#6495ED"; 
  109.   arTest[86] = "#0000C8"; 
  110.   arTest[87] = "#1560BD"; 
  111.   arTest[88] = "#1E90FF"; 
  112.   arTest[89] = "#4B0082"; 
  113.   arTest[90] = "#002FA7"; 
  114.   arTest[91] = "#BDBBD7"; 
  115.   arTest[92] = "#003366"; 
  116.   arTest[93] = "#000080"; 
  117.   arTest[94] = "#CCCCFF"; 
  118.   arTest[95] = "#32127A"; 
  119.   arTest[96] = "#B0E0E6"; 
  120.   arTest[97] = "#003153"; 
  121.   arTest[98] = "#4169E1"; 
  122.   arTest[99] = "#082567"; 
  123.   arTest[100] = "#4682B4"; 
  124.   arTest[101] = "#120A8F"; 
  125.   arTest[102] = "#ADD8E6"; 
  126.   
  127.   // 靛青色系
  128.   arTest[103] = "#5B77AF"; 
  129.   arTest[104] = "#6684B0"; 
  130.   arTest[105] = "#134098"; 
  131.   arTest[106] = "#527AA3"; 
  132.   arTest[107] = "#005789"; 
  133.   arTest[108] = "#005178"; 
  134.   arTest[109] = "#005978"; 
  135.   arTest[110] = "#00456B"; 
  136.   arTest[111] = "#001954"; 
  137.   arTest[112] = "#002E5A"; 
  138.   arTest[113] = "#38426A"; 
  139.   arTest[114] = "#04163A"; 
  140.   
  141.   //  紫色系
  142.   arTest[115] = "#735B9F"; 
  143.   arTest[116] = "#7C509D"; 
  144.   arTest[117] = "#D8BFCB"; 
  145.   arTest[118] = "#BBA1CB"; 
  146.   arTest[119] = "#A688B1"; 
  147.   arTest[120] = "#7E4985"; 
  148.   arTest[121] = "#923D92"; 
  149.   arTest[122] = "#6F196F"; 
  150.   arTest[123] = "#C5AFC0"; 
  151.   arTest[124] = "#8B0062"; 
  152.   arTest[125] = "#D369A4"; 
  153.   arTest[126] = "#D188A8"; 
  154.   arTest[127] = "#D188A8"; 
  155.   arTest[128] = "#EDE0E6"; 
  156.   arTest[129] = "#9D899D"; 
  157.   
  158.   // 灰色系
  159.   arTest[130] = "#FFFFFF"; 
  160.   arTest[131] = "#E6E6E6"; 
  161.   arTest[132] = "#CCCCCC"; 
  162.   arTest[133] = "#B3B3B3"; 
  163.   arTest[134] = "#999999"; 
  164.   arTest[135] = "#808080"; 
  165.   arTest[136] = "#666666"; 
  166.   arTest[137] = "#4D4D4D"; 
  167.   arTest[138] = "#1A1A1A"; 
  168.   arTest[139] = "#000000"; 
  169.   
  170.   var iCount = 0;
  171.   var iLen = arTest.length;
  172.   
  173.   while(iCount<iLen)
  174.   {
  175. /*
  176.    fTest(fGetCompColor(arTest[iCount]), arTest[iCount]);
  177.    document.write("<li/>FgColor: "+arTest[iCount]+" | BgColor: "+fGetCompColor(arTest[iCount]));
  178. */
  179.    fTest(arTest[iCount], fGetCompColor(arTest[iCount]));
  180.    document.write("<li/>BgColor: "+arTest[iCount]+" | FgColor: "+fGetCompColor(arTest[iCount]));
  181.    //document.write("<p/>");
  182.    iCount++;
  183.   }
  184.   
  185.   document.write("<p/><hr/><p/>随机颜色: <p/>");
  186.   
  187.   var iCount = 0;
  188.   var iLen = 100;
  189.   
  190.   while(iCount<iLen)
  191.   {
  192.    var MyColor = "#"+fRndCor(0, 255, true);
  193.    fTest(MyColor, fGetCompColor(MyColor));
  194.    document.write("<li/>BgColor: "+MyColor+" | FgColor: "+fGetCompColor(MyColor));
  195.    //document.write("<p/>");
  196.    iCount++;
  197.   }
  198.   
  199.  function fGetCompColor(sInput, sOpt, bNoSharp, bDebug)
  200.  {// shawl.qiu script
  201.   if(!sInput) sInput = "#000000";
  202.   if(!sOpt) sOpt = 'hex';
  203.   sOpt = sOpt.toLowerCase();
  204.   
  205.   var arCell = [];
  206.   var arHex = [];
  207.   var arHexFinal = [];
  208.   var arInt = [];
  209.   var arIntFinal = [];
  210.   
  211.   var Debug = bDebug;
  212.   
  213.   if(Debug)
  214.   {
  215.    alert
  216.    (
  217.     "sInput: "+sInput
  218.     +" sOpt: "+sOpt
  219.    );
  220.   }
  221.   
  222.   sInput = sInput.replace(/^/#/, "");
  223.    
  224.   switch(sOpt)
  225.   {
  226.    case "rgb":
  227.     break;
  228.     
  229.    default:
  230.     
  231.     if(sInput.length==3)
  232.     {
  233.      var arTemp = fStringToArray(sInput);
  234.      sInput = ""+arTemp[0]+arTemp[0]+arTemp[1]+arTemp[1]+arTemp[2]+arTemp[2];
  235.     }
  236.     
  237.     if(sInput.length==6)
  238.     {
  239.      arCell = fStringToArray(sInput);     
  240.      
  241.      arHex[0] = "0x"+arCell[0]+arCell[1];
  242.      arHex[1] = "0x"+arCell[2]+arCell[3];
  243.      arHex[2] = "0x"+arCell[4]+arCell[5];
  244.      
  245.      arInt[0] = parseInt(arHex[0], 16);
  246.      arInt[1] = parseInt(arHex[1], 16);
  247.      arInt[2] = parseInt(arHex[2], 16);
  248.      
  249.      arIntFinal[0] = Math.abs(255-arInt[0]);
  250.      arIntFinal[1] = Math.abs(255-arInt[1]);
  251.      arIntFinal[2] = Math.abs(255-arInt[2]);
  252.      
  253.      arHexFinal[0] = fPadStr(arIntFinal[0].toString(16)).toUpperCase();
  254.      arHexFinal[1] = fPadStr(arIntFinal[1].toString(16)).toUpperCase();
  255.      arHexFinal[2] = fPadStr(arIntFinal[2].toString(16)).toUpperCase();
  256.      
  257.      if(Debug)
  258.      {
  259.       alert("arCell: "+arCell);
  260.       alert("arHex: "+arHex);
  261.       alert("arInt: "+arInt);
  262.       alert("arIntFinal: "+arIntFinal);
  263.       alert("arHexFinal: "+arHexFinal);
  264.      }
  265.      
  266.      if(bNoSharp) return arHexFinal.join("");
  267.      
  268.      return "#"+arHexFinal.join("");
  269.     }
  270.     else
  271.     {
  272.      alert("无法识别的十六进制颜色代码!");
  273.     }
  274.     break;   
  275.   }
  276.   return "000000";
  277.  
  278.   function fStringToArray(sInput)
  279.   {// shawl.qiu script
  280.    var arCell = [];
  281.    var iCount = 0;
  282.    var iLen = sInput.length;
  283.    while(iCount<iLen)
  284.    {
  285.     arCell[iCount] = sInput.charAt(iCount);
  286.     iCount++;
  287.    }
  288.    
  289.    return arCell;
  290.   } // end function fStringToArray
  291.   
  292.   function fPadStr(sSrc, sPad, nLen)
  293.   {// shawl.qiu script
  294.    if(!sSrc)return false;
  295.    if(!sPad)sPad='0';
  296.    if(!nLen)nLen=2;
  297.    sSrc+='';
  298.    if(sSrc.length>=nLen)return sSrc;
  299.    sPad=new Array(nLen+1).join(sPad);
  300.    var re=new RegExp('.*(.{'+(nLen)+'})$');
  301.    return (sPad+sSrc).replace(re,'$1');
  302.   } // end function fPadStr
  303.  } // end function fGetCompColor
  304.  
  305.  function fRndCor(under, over, bNoPadSymbol)
  306.  {// shawl.qiu code
  307.   if(arguments.length==1)
  308.   {
  309.    var over=under;
  310.     under=0;
  311.   }
  312.   else if(arguments.length==0)
  313.   {
  314.    var under=0;
  315.    var over=255;
  316.   } // end if
  317.   
  318.   var r=fRandomBy(under, over).toString(16);
  319.    r=fStrPadStr(r, r, 2);
  320.   var g=fRandomBy(under, over).toString(16);
  321.    g=fStrPadStr(g, g, 2);
  322.   var b=fRandomBy(under, over).toString(16);
  323.    b=fStrPadStr(b, b, 2);
  324.    //defaultStatus=r+' '+g+' '+b
  325.   if(bNoPadSymbol) return (""+r+g+b).toUpperCase();
  326.   return '#'+(r+g+b).toUpperCase()+';';
  327.  
  328.   function fRandomBy(under, over)
  329.   {// shawl.qiu code
  330.    switch(arguments.length)
  331.    {
  332.     case 1: return parseInt(Math.random()*under+1);
  333.     case 2: return parseInt(Math.random()*(over-under+1) + under);
  334.     defaultreturn 0;
  335.    } // end switch
  336.   } // end function fRandomBy
  337.   
  338.   function fStrPadStr(sSrc, sPad, nLen)
  339.   {
  340.    if(!sSrc)return false;
  341.    if(!sPad)sPad='0';
  342.    if(!nLen)nLen=2;
  343.    sSrc+='';
  344.    if(sSrc.length>=nLen)return sSrc;
  345.    sPad=new Array(nLen+1).join(sPad);
  346.    var re=new RegExp('.*(.{'+(nLen)+'})$');
  347.    return (sPad+sSrc).replace(re,'$1');
  348.   } // end function fStrPadStr
  349.  } // end function fRndCor
  350.  
  351.  function fTest(sBgColor, sFgColor)
  352.  {
  353.   document.write
  354.   (
  355.    '<div style=" color:'+sFgColor
  356.    +'; background-color:'+sBgColor+'; font-size:18px;">补色测试, Complementary Color test.</div>'
  357.   );
  358.  } // end function fTest
  359. //]]>
  360. </script>
  361. </head>
  362. <body>
  363. </body>
  364. </html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值