2012-05-25 8 views

Respuesta

39

usted tiene que crear un lienzo en la memoria y luego dibujar en este lienzo la imagen:

var canvas = document.createElement('canvas'); 
var context = canvas.getContext('2d'); 
var img = document.getElementById('myimg'); 
canvas.width = img.width; 
canvas.height = img.height; 
context.drawImage(img, 0, 0); 
var myData = context.getImageData(0, 0, img.width, img.height); 

Pero esto no va a funcionar si la imagen viene de otro dominio. Esta es una restricción de seguridad que no puede evitar si no tiene control del servidor (tenga cuidado de que si abre su archivo html con el archivo: // tendrá muchas restricciones adicionales, use http: //)

+2

Otro punto a tener en cuenta: los valores de píxeles que se muestran con drawImage pueden ser diferentes de los valores de la imagen debido a la corrección del espacio de color. Lo bueno es que esto solo ocurre si la imagen contiene información de espacio de color. – ironic

+0

@ironic Sí, me encontré con ese problema, vale la pena señalar, ya que puede ser muy doloroso de depurar. –

+9

El título dice explícitamente "sin lienzo" independientemente del lienzo que exista en el árbol DOM o no. Es por eso que di -1 a esta respuesta. – ozanmuyes

14

Como ya se ha sugerido, Canvas ofrece la única solución para crear objetos ImageData.

Si realmente está configurado en contra de usar el elemento canvas para cargar los datos de imagen (tal vez estamos hablando LTE IE8), siempre se puede tener en cuenta al analizar los datos de la imagen base 64 utilizando la ubicación src de una imagen objeto

http://blog.calyptus.eu/seb/2009/05/png-parser-in-javascript/

Es difícil, pero si debe, podría potencialmente analizar las imágenes en una matriz de esta manera.

https://github.com/devongovett/png.js/blob/master/png.js

Esto le muestra cómo cargar los datos con una petición xhr y analizar los datos PNG. Internamente utiliza el lienzo para otras cosas, pero el subconjunto que le interesa no tiene lienzo. Debería seguir una implementación similar para cada formato de imagen que le interese.

Debo mencionar que las limitaciones de lectura de píxeles de la imagen son idénticas en términos de seguridad. Nunca podrá leer píxeles que provienen de un tercero, con o sin lienzo. XMLHTTPRequest va a estar ligado al gobierno de las políticas entre dominios. Esto evita que las secuencias de comandos roben contenido de terceros, que incluye imágenes que pueden contener información sensible del usuario.

Si necesita leer imágenes en un dominio de terceros (que no requieren autenticación para ver), debe ejecutar un servidor proxy de imágenes en su dominio que le permita solicitar imágenes en el mismo dominio. Si necesita tomarse las molestias de eso, podría ser más fácil simplemente proporcionar los datos de la imagen como una matriz json en primer lugar.

+0

la autenticación y el rastreo del navegador son dos grandes razones por las que la carga del servidor de la URL no es factible – Michael

+0

Arg. Lamentablemente, el primer enlace ha muerto: el mensaje se carga, pero el código de la demo nunca llegó a la transición del sitio, y el archivo web nunca lo consiguió. –

+0

@ i336_ Mira el repositorio de github https://github.com/calyptus/labs/blob/master/JSBin/Demo/Viewer.html –

Cuestiones relacionadas