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); // 彩度を落とした色