カラーパレット抽出ツール
画像をアップロードして、その画像を実際に特徴づけている色を抽出します。スウォッチをクリックすると16進コードをコピーできます。
クリックして画像を選択、またはここにドラッグ&ドロップ
貼り付け(Ctrl+V)にも対応しています。端末内で完結し、何もアップロードされません。
仕組み
色はcanvas APIを使って画像から直接サンプリングされ、類似度でグループ化されます。何もアップロードされず、すべてブラウザ内で完結します。
仕組み
画像はオフスクリーンキャンバスに、長辺が最大200pxになるよう縮小して描画されます。サムネイルでも元画像とほぼ同じ色分布が得られるうえ、処理速度が桁違いに速くなるためです。getImageData()で取得した生のRGBAピクセルのうち、半分以上透明なものは除外されるので、透明背景のロゴが「ほぼ何もない」と判定されることはありません。残ったピクセルはチャンネルごとに6段階、合計216個のバケットに振り分けられ、各バケットは実際のピクセル値の合計を保持します。ピクセル数の多い順にバケットを並べ、上位N個を採用し、各スウォッチはバケットの中心値ではなく実際に含まれたピクセルの平均値とすることで、結果が不自然に単純化されるのを防いでいます。
つまりこれはk-meansやメディアンカットではなく、均一量子化によるヒストグラム集計です。あえてこの方式にしているのは、瞬時に処理できて、毎回必ず同じ結果が返ってくるためです(k-meansはランダムな初期値から始まるため、実行のたびにわずかに異なる結果になり得ます)。正直な弱点として、頻度ランキングは「重要度」ではなく「面積」を測っています。ベージュの壁を背景にした人物写真は、被写体の青いジャケットより先に5種類ものベージュを返すでしょう。壁の方が単純にピクセル数が多いからです。主役の色を知りたい場合は、色数を増やしてリストの後半を見るか、注目したい領域だけを切り抜いてからアップロードしてください。
画像がサーバーに送られることはありません。ローカルのオブジェクトURLとして読み込まれ、メモリ内のキャンバスに描画され、バイト列として読み取られる、すべてこのページのJavaScript内で完結する処理です。
よくある質問
画像はどこかにアップロードされますか?
いいえ。すべてのピクセルはcanvas APIを使ってローカルで読み取られます。サーバーには何も送信されません。
色はどうやって選ばれていますか?
ピクセルは類似度によってグループ(バケット)に分けられ、最も多いバケットがパレットになります。各色はそのバケットに含まれた実際のピクセルの平均値です。
想定していた色と正確に一致しないのはなぜですか?
画像内で占める割合が小さい、または細い部分は平均化されて埋もれてしまうことがあります。色数を増やすと、より多くのディテールを拾えます。