2010-05-22 15 views

risposta

8

Il modo più semplice per farlo è utilizzare la funzione toDataURL().

Diciamo che avete una tela:

var canvas = document.getElementById("myCanvas"); 

Poi, con un pulsante con ID "saveButton", si può fare pop aprire una nuova finestra con la tela come un png, e l'utente può salvare che pagina.

document.getElementById("saveButton").onClick = function() { 
    window.open(canvas.toDataURL()); 
} 
+0

Il problema con questo è che (da Chrome) dà un errore: SECURITY_ERR: DOM Exception 18. ho trovato riferimenti a questo errore (http: // lists.w3.org/Archives/Public/public-webapi/2006May/0027.html, ad esempio), ma nessuna informazione su (o meno) è possibile aggirarla. –

+0

Ho appena scoperto che l'errore si verifica localmente, ma non se il codice viene eseguito su un server. Tuttavia, sto ancora cercando un modo per fornire una finestra di dialogo Salva con nome (come in Firefox) e non solo aprire il PNG in una nuova finestra. –

+1

Sono abbastanza sicuro che non è possibile far apparire la finestra di dialogo di salvataggio; il meglio che puoi fare è aprire il PNG risultante in una nuova scheda e salvare l'utente. Questo è il comportamento che vedo in tutte le applicazioni su tela che ho visto. Modificato la mia risposta per la finestra aperta. –

1

Sam Dutton: (per quanto riguarda commento lasciato in risposta di Timothy Armstrong) Il 'SECURITY_ERR: DOM Exception 18' errore che stai ricevendo è probabilmente perché nella tua tela che hai caricato un'immagine che proviene da una diversa dominio, ad es. forse l'immagine è ospitata sul tuo server quindi perché vedi l'errore localmente ma non quando è ospitato sul tuo server. Ogni volta che si caricano immagini da un dominio esterno in una tela, alcune chiamate API vengono bandite per motivi di sicurezza, come ad esempioDataUrl() e getPixelData(). È simile allo stesso problema relativo alle norme di origine riscontrato con le chiamate Ajax tra domini.

Per quanto riguarda SaveAs Canvas, l'implementazione del browser è discutibile, per i browser che non la supportano, credo che si possa ancora visualizzare la tela come immagine all'interno di un tag <img />. Basta impostare l'attributo src ai dati che si ricevono daDataUrl(), quindi è possibile invitare l'utente a fare clic con il pulsante destro del mouse -> Salva come. Credo che la demo nel link che hai postato lo faccia.

+0

Grazie per i vostri commenti. L'errore di sicurezza si verifica quando toDataURL() viene eseguito localmente (ovvero non su un server). Per creare il contenuto dell'elemento canvas, sto chiamando drawImage con un file video locale come origine, ad esempio: canvasContext.drawImage (videoEl, 0, 0, videoWidth/2, videoHeight/2); –

+0

Sei sicuro che il file video sia locale e non proveniente dal tuo server? –

+0

>> Sei sicuro che il file video sia locale << Sì: il video si trova in una directory locale e vi si accede tramite un percorso src come questo: "video/myVideo.ogv". –