JSで10進数と16進数の相互変換

作成日:2018-07-25, 更新日:2018-07-25

基本

10進数を16進数、16進数を10進数にする

10進数を16進数にする

function to16From10(i){
  i = i - 0;
  if(0<=i && i<=9) return i;
  if(i == 10) return "A";
  if(i == 11) return "B";
  if(i == 12) return "C";
  if(i == 13) return "D";
  if(i == 14) return "E";
  if(i == 15) return "F";
}

16進数を10進数にする

function to10From16(s){
  if(s.match(/[0-9]/i)) return s - 0;
  if(s.match(/A/i)) return 10;
  if(s.match(/B/i)) return 11;
  if(s.match(/C/i)) return 12;
  if(s.match(/D/i)) return 13;
  if(s.match(/E/i)) return 14;
  if(s.match(/F/i)) return 15;
}

彩度を下げたい

指定した色の彩度を下げたい・・・ということで、そもそも「彩度を下げる」とはどういうことか、そして、どうすれば彩度が下がるのかを考えてみた。

・「彩度を下げる」は「グレーに近づけていく」というコト。
・「彩度を下げる」にはRGBの各要素の最大値と最小値の真ん中の値にする。

「#8FC93C」を彩度を落として完全にグレーにする

まずRGBの各要素の最大値と最小値を調べる。
・最大値はG=C9
・最小値はB=3C

最大値と最小値の真ん中の値

▼計算式

(最大値と最小値の真ん中)=(最大値-最小値)/2+最小値

▼「#8FC93C」の場合

(最大値と最小値の真ん中)=(C9-3C)/2+3C

▼「10進数」で計算。

=(201-60)/2+60=130.5=131

▼「131」を16進数に戻す。

=83

よって、
「RGB=#838383」が彩度を落とした色になる。

「#8FC93C」を彩度を落として、元の色とグレーの中間の色にしたい

・「#8FC93C」をグレーにすると「#838383」
・欲しいのは「#8FC93C」と「#838383」の中間の色。

つまり
・「R:8F→83」の中間の色:89
・「G:C9→83」の中間の色:A6
・「B:3C→83」の中間の色:60

彩度を上げたい

彩度を下げる場合はグレーにすればいいんだけど・・・上げる場合は白にすれば良いってわけじゃない。

以下は、個人的なメモ。

要は・・・色相環の色にする。

色相環の色:RGBの内、
・少なくとも一つが0
・少なくとも一つが255
の二つの条件を満たす色

彩度をあげるには
RGBの
・もっとも低い値を0
・もっとも高い値を255
にすれば良い。

「Photoshopでの彩度をあげる」は
・もっとも低い値と0の差の絶対値と
・もっとも高い値と255の差の絶対値
を比較して値の小さい方を加える・引く

例)R=50、G=100、B=210

・もっとも低い値「R=50」
・もっとも高い値「B=210」

▼(R:50-0)の絶対値と(B:210-255)の絶対値を比較
・(R:50-0)の絶対値:50
・(B:210-255)の絶対値:45
絶対値の小さいほうを使う:45

▼「R=50、G=100、B=210」の彩度をあげる場合
・R=50 → -45する
・G=100 → 何もしない
・B=210 → +45する
→「R=5、G=100、B=255」となる。

色コードの変換をしたい

任意の色の反転色や薄めた色が欲しくて、クラス化。

(function($) {
  $.extend({
    
    to10from16: function(s){
      /// <summary>
      /// 16進数(0~F)を10進数(0~16)にする
      /// </summary>
      if(s.match(/[0-9]/i)) return s - 0;
      if(s.match(/A/i)) return 10;
      if(s.match(/B/i)) return 11;
      if(s.match(/C/i)) return 12;
      if(s.match(/D/i)) return 13;
      if(s.match(/E/i)) return 14;
      if(s.match(/F/i)) return 15;
    },
    
    to16from10: function(i){
      /// <summary>
      /// 10進数(0~16)を16進数(0~F)にする
      /// </summary>
      i = i - 0;
      if(0 <= i && i <= 9) return i;
      if(i == 10) return "A";
      if(i == 11) return "B";
      if(i == 12) return "C";
      if(i == 13) return "D";
      if(i == 14) return "E";
      if(i == 15) return "F";
    },
    
    to16ForColCode: function(obj){
      /// <summary>
      /// 10進数の色コードを16進数(0~255)に変換して配列で返す
      /// </summary>
      var chk_i = obj;
      
      if(chk_i - 0 > 255)obj = "255";
      if(chk_i - 0 < 0)obj = "0";
      
      var r1 = obj - 0;
      var r1_10 = Math.floor(r1 / 16);
      var r1_1  = r1 - (r1_10 * 16);
      var rtnColor = "" + $.to16from10(r1_10) + $.to16from10(r1_1);
      
      return rtnColor;
    },
    
    getAryTo10ForColCode: function(inputColor){
      /// <summary>
      /// 16進数の色コードを10進数に変換して配列で返す
      /// </summary>
      var RGB10 = new Array;
      var RGB16 = new Array;
      
      //#123456の場合、[0]=12,[1]=34,[2]=56
      RGB16.push(inputColor.substring(1,3));
      RGB16.push(inputColor.substring(3,5));
      RGB16.push(inputColor.substring(5));
      
      for(colorNum=0; colorNum<RGB16.length; colorNum++){
        var col1 = $.to10from16(RGB16[colorNum].substring(0,1));
        var col2 = $.to10from16(RGB16[colorNum].substring(1));
        var col1 = col1 * 16;
        var col3 = col1 - 0 + col2;
        RGB10.push(col3);
      }
      
      return RGB10;
    },
    
    getAryTo16ForColCode: function(inputColor){
      /// <summary>
      /// 10進数の色コード(配列)を16進数に変換
      /// </summary>
      var RGB16 = new Array;
      var colorCode = 0;
      
      for(colorNum=0; colorNum<inputColor.length; colorNum++){
        if(inputColor[colorNum]>255){
          colorCode = 255;
        }
        else if(inputColor[colorNum]<0){
          colorCode = 0;
        }
        else{
          colorCode = inputColor[colorNum];
        }
        var r1 = colorCode - 0;
        var r1_10 = Math.floor(r1 / 16);
        var r1_1  = r1 - (r1_10 * 16);
        var rtnColor = "" + $.to16from10(r1_10) + $.to16from10(r1_1);
        RGB16.push(rtnColor);
      }
      return RGB16;
    },
    
    reverseColor: function(Reverse){
      /// <summary>
      /// 反転色
      /// </summary>
      
      // RGBをそれぞれ10進数に変換
      var aryCol10 = $.getAryTo10ForColCode(Reverse);
      
      var rR = $.to16ForColCode(Math.round(255 - aryCol10[0]));
      var rG = $.to16ForColCode(Math.round(255 - aryCol10[1]));
      var rB = $.to16ForColCode(Math.round(255 - aryCol10[2]));
      var rColor = "#" + rR + rG + rB;
      
      return rColor;
    },
    
    thinnedColor: function(inputColor, colorDensity){
      /// <summary>
      /// 指定された色を薄める
      /// 
      ///  - colorDensity: 濃度の割合(30%にしたいなら「70」)
      /// </summary>
      
      // RGBをそれぞれ10進数に変換
      var aryCol10 = $.getAryTo10ForColCode(inputColor);
      
      var rR = $.to16ForColCode( Math.round((255 - aryCol10[0]) * colorDensity / 100 + aryCol10[0]) );
      var rG = $.to16ForColCode( Math.round((255 - aryCol10[1]) * colorDensity / 100 + aryCol10[1]) );
      var rB = $.to16ForColCode( Math.round((255 - aryCol10[2]) * colorDensity / 100 + aryCol10[2]) );
      var rColor = "#" + rR + rG + rB;
      
      return rColor;
    },
    
    getDownChroma: function(intCol, mdlCol, dwnLevel) {
      // 彩度を下げる(dwnLevel=1で無彩色)
      var rstCol;
      if( intCol <= mdlCol ){
        rstCol = ( mdlCol - intCol ) * dwnLevel + intCol;
      }
      else{
        rstCol = ( intCol - mdlCol ) * dwnLevel - intCol;
      }
      
      return Math.abs( Math.round(rstCol) );
    },
    
    downChroma: function(defCol, dwnLevel){
      var eleCol = $.getAryTo10ForColCode(defCol);
      
      var fstCol = eleCol[0];
      
      // 最大値
      var maxCol = fstCol;
      for(var i=1; i<eleCol.length; i++){
        if( maxCol < eleCol[i] ){
          maxCol = eleCol[i];
        }
      }
      
      // 最小値
      var minCol = fstCol;
      for(var i=1; i<eleCol.length; i++){
        if( eleCol[i] < minCol ){
          minCol = eleCol[i];
        }
      }
      
      var midCol = Math.abs( Math.round((maxCol-minCol)/2+minCol) );
      
      var tmpCol = '#';
      for (var i in eleCol) {
        tmpCol += $.to16ForColCode( $.getDownChroma(eleCol[i], midCol, dwnLevel) );
      }
      
      return tmpCol;
    }
  
  });
})(jQuery);

var oriCol = "#0330ff";
var Density = 70; //濃度の割合:30%なら70
var chgCol1 = $.thinnedColor(oriCol, Density); // 色を薄める
var chgCol2 = $.reverseColor(oriCol);          // 反転色

var dwnLevel = 0.5;
var chgCol = $.downChroma(oriCol, dwnLevel);   // 彩度を落とした色

サンプル

Javascript/Jqueryで色コードを変える