Escribí solo por diversión. Es un plugin jquery, si no lo usa puede leerlo para algunos punteros. Si hay algún error durante la llamada al get_colors
, se establece una matriz en el valor de retorno para contener los errores, devuelve una matriz de objetos, estos objetos son un histograma de una imagen (un elemento en la matriz para cada elemento seleccionado).
(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);
Si un documento de una sola imagen con 4 píxeles (2x2) "# FF0000, # 00ff00, # 0000ff, # FF0000", con si lo hace $('img').get_colors();
vuelve [{"ff0000": 2, "0000ff": 1, "00ff00":1}]
.
Para aprender a usar el elemento canvas puede consultar MDN y specs en desarrollo para obtener detalles sobre la manipulación de píxeles.
Editar: comentado una línea que estaba utilizando al depurar.
No No, no hay carga. Acaba de obtener el color de una imagen en la página – aurel
Simplemente dibuje la imagen en un elemento de lienzo y revise usted mismo. No sé lo que espera como devolución de 'get_colors'. – Prusse
No he usado lienzo antes (recientemente comencé a buscar en html5) así que lo probaré - ¿Conoces algún recurso que pueda cubrir el efecto del que estás hablando @Prusse – aurel