En primer lugar, dibujar la imagen en un canvas
:
function draw(img) {
var canvas = document.createElement("canvas");
var c = canvas.getContext('2d');
c.width = canvas.width = img.width;
c.height = canvas.height = img.height;
c.clearRect(0, 0, c.width, c.height);
c.drawImage(img, 0, 0, img.width , img.height);
return c; // returns the context
}
Ahora puede iterar sobre los píxeles de la imagen. Un enfoque ingenuo para la detección del color es simplemente contar la frecuencia de cada color en la imagen.
// returns a map counting the frequency of each color
// in the image on the canvas
function getColors(c) {
var col, colors = {};
var pixels, r, g, b, a;
r = g = b = a = 0;
pixels = c.getImageData(0, 0, c.width, c.height);
for (var i = 0, data = pixels.data; i < data.length; i += 4) {
r = data[i];
g = data[i + 1];
b = data[i + 2];
a = data[i + 3]; // alpha
// skip pixels >50% transparent
if (a < (255/2))
continue;
col = rgbToHex(r, g, b);
if (!colors[col])
colors[col] = 0;
colors[col]++;
}
return colors;
}
function rgbToHex(r, g, b) {
if (r > 255 || g > 255 || b > 255)
throw "Invalid color component";
return ((r << 16) | (g << 8) | b).toString(16);
}
getColors
devuelve un mapa de nombres de colores y recuentos. Los píxeles transparentes se saltan. Sería trivial obtener el color que se ve con mayor frecuencia en este mapa.
Si, literalmente, quiere una promedio de cada componente de color, que podría fácilmente que a partir de los resultados de getColors
, también, pero los resultados no son propensos a ser muy útil. This answer explica un enfoque mucho mejor.
Se puede utilizar en todo como esto:
// nicely formats hex values
function pad(hex) {
return ("000000" + hex).slice(-6);
}
// see this example working in the fiddle below
var info = document.getElementById("info");
var img = document.getElementById("squares");
var colors = getColors(draw(img));
for (var hex in colors) {
info.innerHTML += "<li>" + pad(hex) + "->" + colors[hex];
}
Ver un working example.
JavaScript no puede manejar archivos cargados por sí mismo. – alex
¿Desea solamente el color exacto del píxel o dentro de un rango de HSV en particular? (Sugeriría que este último le servirá mejor.) – Phrogz