【JavaScript】画面の色を抜き出す Eye Dropper API

先日 Chrome 95 がリリースされました。いつもながら、様々な機能が追加されたわけですが、その中に Eye Dropper API という気になる JavaScript API がありましたので、紹介したいと思います。

Eye Dropper とは

一般的に Eye Dropper という用語はあまりなじみはないですよね。カラーピッカーと言えば分かりやすいでしょうか。ただ、パレットから色を選択する UI ではなく、虫眼鏡のような領域が出て、それを自由に動かせて、画面上の色を拾う UI になっています。

このようにピクセルを判別できるほどに拡大表示して、その一つのピクセルを拾います。Photoshop などのレタッチソフトのスポイトツールに近いですね。

Eye Dropper API は、JavaScript を使って Eye Dropper を表示させ、ユーザーがピクセルを選択したら、その色を JavaScript から取り出せます。

標準化

Eye Dropper API は W3C の Web Platform Incubator Community Group にて提案された API です。仕様書案も公開されています。

まだ勧告に至っていない API ですので、今後どうなるのかは分かりません。つまり、詳細が変更される可能性があります。現時点では Chrome だけがこの API を実装しています。他のブラウザーは実装しないかもしれません。

Chrome と同じ Chromium ベースの Edge や Opera はこの API が利用できるようになるかもしれませんね。

使い方

まずは Eye Dropper を使ってみましょう。このページに Chrome でアクセスしてくださいね。

「Open」ボタンを押すと、Eye Dropper が表示されるはずです。ブラウザー内だけでなく、デスクトップ上のピクセルまで取り出せるのが分かると思います。そして選択を終了すると、ボタンの横に選択したピクセルの色が 16 進数表記で表示されます。

このサンプルの HTML と JavaScript コードは次の通りです。

<p>
  <button id="eye-dropper-btn" disabled="">Open</button>
  <span id="eye-dropper-msg"></span>
</p>
const msg_el = document.getElementById('eye-dropper-msg');
const btn_el = document.getElementById('eye-dropper-btn');

if (window.EyeDropper) {
  btn_el.disabled = false;
  btn_el.addEventListener('click', async () => {
    const eyeDropper = new EyeDropper();
    const result = await eyeDropper.open();
    msg_el.textContent = result.sRGBHex;
    console.log(JSON.stringify(result, null, '  '))
  }, false);
} else {
  const msg = 'Eye Dropper API を利用できません。';
  msg_el.textContent = msg;
}

コード解説

JavaScript コードを簡単に解説しましょう。まず Eye Dropper API が利用可能なのかをチェックします。

if (window.EyeDropper) {...}

もし Eye Dropper API をサポートしたブラウザーであれば、window.EyeDropper が存在するはずです。

もしブラウザーが Eye Dropper API をサポートしていることが分かれば、EyeDroper() コンストラクタから EyeDroper オブジェクトを生成します(変数 eyeDropper)。

const eyeDropper = new EyeDropper();

次に EyeDroper オブジェクトの open() メソッドを使って、Eye Dropper を表示させます。

const result = await eyeDropper.open();

ここで注意してほしいのは、open() メソッドは Promise オブジェクトを返す非同期のメソッドであるという点です。そのため、ここでは await を使って open() メソッドを呼び出しています。

ユーザーがピクセルの選択を終えると、open() メソッドは返ってきます。そして、上記の変数 result に結果が代入されます。この代入された値は次のようなオブジェクトです。

{
  "sRGBHex": "#00b2fd"
}

このように、sRGBHex プロパティに 16 進数表記の色情報がセットされたオブジェクトが得られます。

利用上の制約

この API は、クリックなどの何かしらのユーザーの操作が伴わなければ機能しません。ウェブページを開いただけで勝手に Eye Dropper が表示させるといったことはできないようになっています。そのため、前述のサンプルではボタンを押させたのです。

まとめ

普段の仕事で、なかなか Eye Dropper API を使うシーンが思い浮かびませんが、もしフォトレタッチやドローツールをウェブベースで開発することになったら、重宝するかもしれませんね。

今回は以上で終わりです。最後まで読んでくださりありがとうございました。それでは次回の記事までごきげんよう。

Share