2012-04-02 12 views
27

Estoy cargando una imagen en js y dibujándola en un lienzo. Después de dibujar, recupero propiedad imageData del lienzo:Datos de origen cruzado en canvas HTML5

var img = new Image(); 
img.onload = function() { 
    canvas.drawImage(img, 0, 0); 
    originalImageData = canvas.getImageData(0,0,width, height)); //chrome fails 
} 
img.src = 'picture.jpeg'; 

Esto funciona perfectamente tanto en Safari y Firefox, pero no en Chrome con el siguiente mensaje:

No es posible obtener datos de imagen de la lona porque el lienzo ha sido contaminado por datos de origen cruzado.

El archivo javascript y la imagen se encuentran en el mismo directorio, por lo que no entiendo el comportamiento de chorme.

+1

posible duplicado de [context.getImageData() en localhost?] (Http://stackoverflow.com/questions/8688600/context-getimagedata-on-localhost) – mplungjan

+3

Si esto no es de un servidor web, aparece este problema Parece que – mplungjan

+0

tiene razón, que resolvió el problema. ¡Gracias! –

Respuesta

24

Para habilitar CORS (Cross-Origin Resource Sharing) para sus imágenes pasan a la cabecera HTTP con la respuesta de la imagen:

Access-Control-Allow-Origin: * 

El origen está determinado por dominio y el protocolo (por ejemplo, http y https no son los mismos) de la página web y no la ubicación del script.

Si está ejecutando localmente usando el archivo: // esto generalmente siempre se ve como un problema de dominio cruzado; así que es mejor ir a través de

http://localhost/ 
+2

es correcto, utilizando el archivo: // se ve como un problema de dominio cruzado. El mismo código que utiliza el archivo: // muestra este error y con http: // funciona bien. Gracias. – pocjoc

7
var img = new Image(); 
img.onload = function() { 
    canvas.drawImage(img, 0, 0); 
    originalImageData = canvas.getImageData(0,0,width, height)); //chrome will not fail 
} 
img.crossOrigin = 'http://profile.ak.fbcdn.net/crossdomain.xml';//crossdomain xml file, this is facebook example 
img.src = 'picture.jpeg'; 

espero que esto ayude

+2

'http://profile.ak.fbcdn.net/crossdomain.xml' no es un valor válido para el [atributo crossorigin] (http://www.w3.org/TR/html5/infrastructure.html#cors-settings-attribute) y los archivos 'crossdomain.xml' son una cosa utilizada por Adobe Flash, no CORS. – Quentin

9

para resolver el problema dominios con file: //, puede comenzar cromo con el parámetro

--allow-file-access-from-files 
+0

Gracias Markus! Esta solución funciona para mí mucho más rápido. Para explicarlo un poco, primero debe salir de Chrome y si está ejecutando en Mac, abra el terminal y ejecute '' 'abrir/Aplicaciones/Google \ Chrome.app --args --allow-file-access-from- comando files''' – yeelan

1
var canvas = document.createElement("canvas"); 
var ctx = canvas.getContext("2d"); 
var img = new Image(); 
img.crossOrigin = "anonymous"; 
img.onload = function() { 
    canvas.width = img.width; 
    canvas.height = img.height; 
    ctx.drawImage(img, 0, 0); 
    originalImageData = ctx.canvas.toDataURL(); 
} 
img.src = 'picture.jpeg'; 

espero que esto ayude.

0

Si los encabezados de respuesta del servidor contienen Access-Control-Allow-Origin: *, entonces puede solucionarlo desde el lado del cliente: Agregue un atributo a la imagen o video.

<img src="..." crossorigin="Anonymous" /> 
 
<video src="..." crossorigin="Anonymous"></video>

lo contrario tendrá que usar de proxy del lado del servidor.