CANVAS要素を使ってCSS向けの色表現からRGB値を得る

CSS向けの色表現はいろいろある

  • red
  • ActiveBorder
  • #123
  • #112233
  • rgb(11,22,33)
  • rgb(11%,22%,33%)
  • rgba(11,22,33,0.4)
  • rgba(11%,22%,33%,0.4)
  • hsl(11,22%,33%)
  • hsla(11,22%,33%,0.4)

これからRGBの値を取得したかったので、解析して割り出すコードを書いたりしたけれども、とても面倒くさい。特にHSLからRGBにするところとか。それにActiveBorderみたいなシステム色はたぶん無理。

でも、canvas要素を使うと簡単に取得できることに気づいた。

function getColor(color) {
  var cv = document.createElement('CANVAS');
  var cx = cv.getContext('2d');
  cv.width = cv.height = 1;
  cx.fillStyle = color;
  cx.fillRect(0, 0, 1, 1);
  var d = cx.getImageData(0, 0, 1, 1).data;
  return [d[0], d[1], d[2]];
}

単にcanvas要素を作って指定色で描画して、ImageDataを取ってくるだけ。これは便利。

追記

createElement('CANVAS')とCANVASが大文字だとXHTMLでうまく動かなくなるとの指摘を受けたので修正。id:os0xさんありがとうございます。ついでに透明度も返してなかったのも修正。

function getColor(color) {
  var cv = document.createElement('canvas');
  var cx = cv.getContext('2d');
  cv.width = cv.height = 1;
  cx.fillStyle = color;
  cx.fillRect(0, 0, 1, 1);
  var d = cx.getImageData(0, 0, 1, 1).data;
  return [d[0], d[1], d[2], d[3]];
}