MENU

JS/jQueryでRGB(A)カラー形式をHEXカラー#ffffff形式に変換する

jQueryの css() 関数を利用して colorbackground-color を取得するとRGB形式になってしまいます。そこで、JSを使ってRGBまたはRGBA形式からHEX形式へ変換する方法を紹介します。

RGBからHEXへ


function rgbToHex(color)
{
  // HEXに変換したものを代入する変数
  var hex = '#';
  
  // 第1引数がHEXのとき変換処理は必要ないのでそのままreturn
  // IE8の場合はjQueryのcss()関数でHEXを返すので除外
  if (color.match(/^#[a-f\d]{3}$|^#[a-f\d]{6}$/i))
  {
    return color;
  }
  
  // 正規表現
  var regex = color.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
  
  // 正規表現でマッチしたとき
  if (regex)
  {
    var rgb =
    [
      // RGBからHEXへ変換
      parseInt(regex[1]).toString(16),
      parseInt(regex[2]).toString(16),
      parseInt(regex[3]).toString(16)
    ];
    
    for (var i = 0; i < rgb.length; ++i)
    {
      // rgb(1,1,1)のようなときHEXに変換すると1桁になる
      // 1桁のときは前に0を足す
      if (rgb[i].length == 1)
      {
        rgb[i] = '0' + rgb[i];
      }
      hex += rgb[i];
    }
    
    return hex;
  }
  
  console.error('第1引数はRGB形式で入力');
}

使い方


var a = rgbToHex('rgb(25, 65, 66)');
console.log(a);  // => #194142

RGBAからHEXへ


function rgbaToHex(fg_color, bg_color)
{
  // HEXに変換したものを代入する変数
  var hex = '#';
  
  // 第1引数がHEXのとき変換処理は必要ないのでそのままreturn
  // IE8の場合はjQueryのcss()関数でHEXを返すので除外
  if (fg_color.match(/^#[a-f\d]{3}$|^#[a-f\d]{6}$/i))
  {
    return fg_color;
  }
  
  // 第1引数の正規表現
  var regex = fg_color.match(/^rgba\((\d+),\s*(\d+),\s*(\d+),\s*(\d*?(?:\.?\d+))?\)$/);
  
  // 正規表現でマッチしたとき
  if (regex)
  {
    // 前景色のRGB成分
    var rgb =
    [
      parseInt(regex[1]),
      parseInt(regex[2]),
      parseInt(regex[3])
    ];
    // 透明度
    var alpha = parseFloat(regex[4]);
    // 背景色のRGB成分(第2引数が省略されたときのデフォルト値)
    var rgb_bg = [255, 255, 255];
    
    // 第2引数があるとき
    if (arguments.length == 2)
    {
      // 第2引数の正規表現
      var regex_rgb = bg_color.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
      var regex_hex = bg_color.match(/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$|^#?([a-f\d]{1})([a-f\d]{1})([a-f\d]{1})$/i);
      
      // 第2引数がRGBのとき
      if (regex_rgb)
      {
        // 背景色のRGB成分を書き換える
        for (var i = 0; i < rgb_bg.length; ++i)
        {
          rgb_bg[i] = parseInt(regex_rgb[i+1]);
        }
      }
      // 第2引数がHEXのとき
      else if (regex_hex)
      {
        // #fff形式のとき
        if (typeof regex_hex[1] == 'undefined')
        {
          // HEXからRGBに変換して背景色のRGB成分に代入
          for (var i = 0; i < rgb_bg.length; ++i)
          {
            rgb_bg[i] = parseInt(regex_hex[i+4] + regex_hex[i+4], 16);
          }
        }
        // #ffffff形式のとき
        else if (typeof regex_hex[4] == 'undefined')
        {
          // HEXからRGBに変換して背景色のRGB成分に代入
          for (var i = 0; i < rgb_bg.length; ++i)
          {
            rgb_bg[i] = parseInt(regex_hex[i+1], 16);
          }
        }
      }
      else
      {
        console.error('第2引数はHEXまたはRGB形式で入力');
        return;
      }
    }
    
    for (var i = 0; i < rgb_bg.length; ++i)
    {
      // 背景色を考慮した透明度による計算
      var tmp = Math.floor((1 - alpha) * rgb_bg[i] + alpha * rgb[i]);
      
      // rgb値は0から255の範囲なので超えた場合は255にする
      if (tmp > 255)
      {
        tmp = 255;
      }
      // HEXに変換
      tmp = tmp.toString(16);
      
      // rgb(1,1,1)のようなときHEXに変換すると1桁になる
      // 1桁のときは前に0を足す
      if (tmp.length == 1)
      {
        tmp = '0' + tmp;
      }
      hex += tmp;
    }
    
    return hex;
  }
  
  console.error('第1引数はRGBA形式で入力');
}

RGBAからHEXへ変換する際は、背景色も考慮する必要があるので、引数が増えています。第2引数は省略でき、省略された場合は背景色が#ffffffとなります。

使い方


var a = rgbaToHex('rgba(25, 65, 66, .8)');
console.log(a);  // => #466667

// 第2引数にはHEX/RGB形式どちらも使えます
var b = rgbaToHex('rgba(25, 65, 66, .8)', '#c8c8c8');
console.log(b);  // => #3b5c5c
var c = rgbaToHex('rgba(25, 65, 66, .8)', 'rgb(23, 1, 120)');
console.log(c);  // => #18344c