抽出した色をカラーチャートのようにjQueryで整形してみました。
色の情報はRGBAで抽出されます。
Aは透明度なので今回は無視。
重複する色はユニークにし、多く使われている色の順に並び替えを行っています。
まずは、色を分析する画像を表示
上記で表示した画像をキャンバスで表示
登場した画像の回数順にカラーチャートを作成。
今回のJSはこちら
//画像を分析するので読み込んでから発火
//$(function(){ にはしない
$(window).load(function(){
var $img = $('#demo_image');
var imgW = $img.width();
var imgH = $img.height();
//取得した画像サイズのcanvasを追加
$("#demo_space").append('<canvas id="myCanvas" width="'+imgW+'" height="'+imgH+'"></canvas>');
//キャンパスに描画するためのコンテキストを用意する
var canvas = document.getElementById('myCanvas'),
ctx = canvas.getContext('2d');
//取得した画像を新しいオブジェクトとして生成する
var image = new Image();
image.src = $img.attr("src");
// 描画する
// drawImage(image.src,開始X,開始Y,終点X,終点Y,リサイズ開始X,リサイズ開始Y,リサイズ終点X,リサイズ終点Y)
ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, imgW, imgH);
// 元画像のサイズのまま描画する場合、ctx.drawImage(image, 0, 0)でよい
var imageData = ctx.getImageData(0,0,imgW,imgH); //全体のカラー情報を取得
// イメージデータを取得する
var data = imageData.data;
array_elements = [];
// 1ピクセルずつ確認して
// rgbaの数字がひたすらカンマ区切りで取得できるので3つだけ配列に入れていく
for(let i = 0, len = data.length; i < len; i += 4) {
r = data[i];
g = data[i + 1];
b = data[i + 2];
array_elements.push(r+','+g+','+b);
}
// ユニーク化するために昇順にする
array_elements.sort();
//文字列のカウントとユニーク化
var current = null;
var cnt = 0;
uniq_arr = [];
ii=0;
for (var i = 0; i < array_elements.length; i++) {
if (array_elements[i] != current) {
if (cnt > 0) {
uniq_arr[ii]={color:current,cnt:cnt}
ii++;
}
current = array_elements[i];
cnt = 1;
} else {
cnt++;
}
}
if (cnt > 0) {
uniq_arr[ii]={color:current,cnt:cnt}
ii++;
}
//降順
uniq_arr.sort(function(a,b){
if(a.cnt>b.cnt) return -1;
if(a.cnt < b.cnt) return 1;
return 0;
});
//ユニークになった配列はこちら
//console.log(uniq_arr);
// 1000色分多い順に取り出すよ
for (var i = 0; i < 1000; i++) {
console.log(uniq_arr[i].cnt);
$("#result").append('<div class="demo_color" style="background-color:rgb('+uniq_arr[i].color+')">'
+uniq_arr[i].cnt
+'</div>')
}
});