2012-04-02 12 views
27

Sto caricando un'immagine in js e la disegno su una tela. Dopo aver disegnato, posso recuperare imageData dalla tela:Dati di origine incrociata nell'area di disegno 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'; 

Questo funziona perfettamente sia in Safari e Firefox, ma non riesce a Chrome con il seguente messaggio:

Impossibile ottenere dati di immagine dalla tela, perché il la tela è stata contaminata da dati di origine incrociata.

Il file javascript e l'immagine si trovano nella stessa directory, quindi non capisco il comportamento di chorme.

+1

possibile duplicato del [context.getImageData() su localhost?] (Http://stackoverflow.com/questions/8688600/context-getimagedata-on-localhost) – mplungjan

+3

Se questo non è da un server web che si ottiene questo problema sembra che – mplungjan

+0

hai ragione, questo ha risolto il problema. Grazie! –

risposta

24

Per abilitare CORS (Cross-Origin Resource Sharing) per le immagini passano l'header HTTP con la risposta immagine:

Access-Control-Allow-Origin: * 

L'origine è determinata dal dominio e il protocollo (ad esempio http e https non sono gli stessi) della pagina web e non la posizione della sceneggiatura.

Se si esegue localmente utilizzando il file: // questo è generalmente sempre visto come un problema di dominio incrociato; quindi è meglio andare via

http://localhost/ 
+2

ha ragione, l'utilizzo di file: // è visto come un problema di dominio incrociato. Lo stesso codice che utilizza file: // mostra questo errore e usa http: // funziona bene. Grazie. – 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'; 

Spero che questo aiuti

+2

'http://profile.ak.fbcdn.net/crossdomain.xml' non è un valore valido per l'attributo [crossorigin] (http://www.w3.org/TR/html5/infrastructure.html#cors-settings-attribute) e i file 'crossdomain.xml' sono una cosa usata da Adobe Flash, non CORS. – Quentin

9

per risolvere la questione del dominio croce con file: //, è possibile avviare Chrome con il parametro

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

Grazie Markus! Questa soluzione funziona per me molto più velocemente. Per spiegarlo un po ', devi prima uscire da chrome e se stai eseguendo su Mac, apri il terminale e avvia '' 'apri/Applicazioni/Google \ Chrome.app --args --allow-file-access-from- file''' – 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'; 

spero che questo aiuti.

0

Se le intestazioni di risposta del server contengono Access-Control-Allow-Origin: *, è possibile correggerlo dal lato client: aggiungere un attributo all'immagine o al video.

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

altrimenti bisogna utilizzare il proxy lato server.

Problemi correlati