Vaya, una pregunta interesante, la verdad es que nunca me lo había planteado.
Investigando un poco he visto que podrías obtener los valores RGB de una imagen píxel a píxel usando el componente canvas de HTML5 y javascript.
Al elementó canvas le podemos inyectar una imagen y nos dota de ciertos métodos para la manipulación de la imagen como el getImageData.
En este ejemplo de jsfiddle puedes verlo en funcionamiento (tan solo pasa el ratón por encima de la imagen para ver el color en el div de abajo de la imagen:
http://jsfiddle.net/vfportero/Rqtnb/
Paso a paso:
En nuestro html tenemos un canvas para pintar la imagen y un div en el que mostraremos el color al pasar por encima con el ratón:
<body>
<canvas id="myCanvas">
Tu navegador no es compatible con HTML5
<canvas>
<div id="color">Color</div>
</body>
En nuestro javascript obtenemos el canvas y su contexto 2d (necesario para pintar la imagen, puedes "pintar" también animaciones en 3d dentro del canvas) y cargamos la imagen:
var color = document.getElementById("color");
var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');
var imageObj = new Image();
imageObj.onload = function() {
context.drawImage(imageObj, 0, 0);
};
imageObj.crossOrigin = "";
imageObj.src = '';
OJO! He tenido problema de CORS al cargar imágenes de lugares externos al que lanza el script por lo que he tenido que agregar la propiedad imageObj.crossOrigin = ""; y usar un servidor de imágenes que si permite CORS como dropbox. En teoría, si la imagen está en tu mismo dominio no debería pasar nada y podrías quitar el crossOrigin = "".
Por último el evento "onmousemove" dentro del canvas nos permite obtener la posición del ratón y obtener la información del pixel de la imagen para pintar el color en el div "color":
canvas.onmousemove = function(e) {
var x = e.clientX;
var y = e.clientY;
// set color now
var canvasColor = context.getImageData(x, y, 1, 1).data; // rgba e [0,255]
var r = canvasColor[0];
var g = canvasColor[1];
var b = canvasColor[2];
color.style.backgroundColor = 'rgb(' + r + ',' + g + ',' + b + ')';
}
Como ves, a getImageData() le pasamos primero la posición del canvas que queremos obtener la info y luego el tamaño (en píxeles) del area que queremos obtener (en este caso solo queremos 1 píxel).
Esto nos devuelve un array con el RGB (cada uno en una posición) y el "alpha" en la posición final.