Я написал просто для удовольствия.Это плагин jquery, если вы не используете его, вы можете прочитать его для некоторых указателей.Если во время вызова get_colors
возникает какая-либо ошибка, в возвращаемом значении устанавливается массив для хранения ошибок, он возвращает массив объектов, эти объекты являются гистограммой изображения (один элемент в массиве для каждого выбранного элемента).
(function($, window, document, undefined){
var canvas = document.createElement('canvas');
if (canvas && canvas.getContext){
$.fn.get_colors = function(){
var rv = [];
this.each(function(){
var tagname = this.tagName.toLowerCase();
if ((tagname === 'img') || (tagname === 'canvas') || (tagname === 'video')){
//something bad can happend when drawing the image
try{
var w = this.getAttribute('width');
var h = this.getAttribute('height');
canvas.setAttribute('width', w);
canvas.setAttribute('height', h);
var ctxt = canvas.getContext('2d');
if (ctxt){
ctxt.drawImage(this, 0, 0);
var imagedata = ctxt.getImageData(0, 0, w, h);
var data = imagedata.data;
//log('imagedata.width:'+imagedata.width+' imagedata.height:'+imagedata.height+' w:'+w+' h:'+h);
var obj = {};
var color = '';
var r = 0, g = 0, b = 0, a = 0;
var pix = data.length;
for (pix--; pix > 2; pix-=4){
//a = data[pix - 0];
b = data[pix - 1];
g = data[pix - 2];
r = data[pix - 3];
if (r < 16) r = '0' + r.toString(16);
else r = r.toString(16);
if (g < 16) g = '0' + g.toString(16);
else g = g.toString(16);
if (b < 16) b = '0' + b.toString(16);
else b = b.toString(16);
//if (a < 16) a = '0' + r.toString(16);
//else a = a.toString(16);
//color = r + g + b + a;
color = r + g + b;
if (obj[color] > 0) ++obj[color];
else obj[color] = 1;
}
rv.push(obj);
imagedata = data = obj = null;
}
ctxt = null;
} catch(error){
if (!rv.errors){
rv.errors = [];
}
rv.errors.push(error);
}
}
});
return rv;
};
} else{
$.fn.get_colors = function(){
throw new Error('canvas element support required!');
};
}
})(jQuery, this, this.document);
Если документ только с одним изображением с 4 пикселями (2x2) "# ff0000, # 00ff00, # 0000ff, # ff0000", если вы делаете $('img').get_colors();
, возвращается [{"ff0000": 2, "0000ff": 1, "00ff00":1}]
.
Чтобы узнать, как использовать элемент canvas, вы можете взглянуть на MDN и на specs в разработке для деталей о манипулировании пикселями.
Редактировать: закомментировал строку, которую я использовал при отладке.