2011-12-31 16 views
7

Ho il seguente frammento di codice e sto cercando di farlo funzionare da localhost (OSX, in esecuzione XAMPP):context.getImageData() su localhost?

var canvas = document.getElementById('mycanvas'); 
    var cx = canvas.getContext('2d'); 

    var myImg = new Image(); 
    myImg.src = 'images/lion.jpg'; 

    $(myImg).load(function() { 
     cx.drawImage(myImg, 0, 0); 
     var imgData = cx.getImageData(0,0,150,150); 
    }); 

Ma quando l'eseguo ottengo questo errore dalla console:

Unable to get image data from canvas because the canvas has been tainted by cross-origin data. 
site.js:11Uncaught Error: SECURITY_ERR: DOM Exception 18 

Ho trovato alcune domande simili qui e so che questo ha qualcosa a che fare con il fatto che sto lavorando localmente e questo non accadrebbe se stavo cercando di accedere all'immagine dallo stesso dominio. Non so se questo ha senso, ma è quello che ho capito.

La mia domanda è: come posso farlo funzionare in un ambiente di sviluppo locale?

risposta

23

Fornisci il tuo html con un server HTTP, ad esempio Apache o Nginx.

Mac OSX viene fornito con installato Python, quindi si può semplicemente avviare un server HTTP con l'apertura di un terminale, quindi immettere:

cd /path/to/my/work/ 
python -m SimpleHTTPServer 

Poi aperto http://localhost:8000/ nel tuo browser. Questo dovrebbe funzionare.

+0

ha funzionato come un fascino, grazie un mucchio! –

+2

Non sempre possibile. Come può essere risolto nelle situazioni in cui stiamo installando un sito su un CD per essere eseguito localmente su un computer di destinazione tramite Autorun.inf e quindi non è possibile configurare un server o fare affidamento su uno (o su qualsiasi accesso di rete) essere disponibile? Opere un fascino in tutti gli altri browser, ma in consolle Chrome dice: "warning Kinetic: Impossibile ottenere l'URL dei dati Impossibile eseguire 'toDataURL' on 'HTMLCanvasElement':.. Tele Tainted non possono essere esportati" volte Sad –

+0

La rete loopback (127.0.0.1) è sempre disponibile. – clowwindy

1

Cercare un browser diverso può essere d'aiuto. Mi è successo su Chromium e, passando a Firefox, ho potuto continuare a eseguire il debug localmente.

0

ho finito per usare una combinazione di soluzioni (vedi this other problem)

Passi:

  1. trasformare l'immagine a stringa base64.
  2. Assegnarlo come src dell'oggetto Image js.
  3. Draw su tela

Codice:

// helper to transform to base64 
// see other question for more help 
function toDataUrl(url, callback) { 
    var xhr = new XMLHttpRequest(); 
    xhr.responseType = 'blob'; 
    xhr.onload = function() { 
    var reader = new FileReader(); 
    reader.onloadend = function() { 
     callback(reader.result); 
    }; 
    reader.readAsDataURL(xhr.response); 
    }; 
    xhr.open('GET', url); 
    xhr.send(); 
} 

var canvas  = document.querySelector("canvas"); 
var ctx   = canvas.getContext("2d"); 
var png   = new Image(); 
var backgroundSrc = "....."; 

png.onload = function() { 
    ctx.drawImage(png, 0, 0); 
}; 

toDataUrl(backgroundSrc, function(base64Img) { 
    png.src = base64Img; 
}); 

So che questa soluzione non è ottimale, ma ha funzionato per me e aiuta quando l'immagine non viene dalla stessa origine.

Sto postando questo per chiunque incontri lo stesso problema.