2011-08-30 1 views
15

Ho implementato una funzione di zoom in e out su un elemento canvas. funziona ridimensionando la tela, traducendola e quindi ridisegnando nuovamente l'intera scena. il problema è che ci vuole un sacco di tempo per ridisegnare tutto perché ho un sacco di cose sulla mia tela.html5: copia una tela per immagine e ritorno

Ho bisogno di un modo per copiare la tela su un oggetto immagine e di copiare nuovamente l'immagine sulla tela senza perdere qualità. quali sono i metodi specifici per copiare la tela su una variabile javascript e per copiare di nuovo questa variabile sulla tela in un secondo momento?

Sarò felice se scriverò il codice perché non ho trovato alcuna buona spiegazione su Internet.

grazie,

+0

Vuoi ripristinare l'immagine ingrandita, o come la dimensione o originariamente era? – Loktar

+0

No, l'unico modo per "mantenere la qualità" su una bitmap è ridisegnarlo. Non c'è un modo magico di aggiungere pixel extra nella bitmap ingrandita senza effettivamente disegnare quei pixel. Se si desidera ingrandire e rimpicciolire mantenendo la nitidezza, utilizzare SVG (vettore) anziché Canvas (bitmap). – robertc

+1

Ok, ho eseguito test delle prestazioni per tutti i metodi nelle risposte di seguito. Il drawImage() di un'altra tela sembra essere il più veloce: http://jsperf.com/canvas-image-store-restore – JustGoscha

risposta

26

Il metodo drawImage() possono disegnare una tela utilizzando un'altra tela invece di un'immagine.

È possibile creare una tela di "backup", delle stesse dimensioni dell'originale, disegnare la prima su di essa e quindi disegnarla nuovamente all'originale quando è necessaria.

ad es.

// Assume we have a main canvas 
// canvas = <main canvas> 
ctx = canvas.getContext('2d'); 
.. 

// create backing canvas 
var backCanvas = document.createElement('canvas'); 
backCanvas.width = canvas.width; 
backCanvas.height = canvas.height; 
var backCtx = backCanvas.getContext('2d'); 

// save main canvas contents 
backCtx.drawImage(canvas, 0,0); 

.. 

// restore main canvas 
ctx.drawImage(backCanvas, 0,0); 
+0

È drawImage() chiamato con Canvas come parametro migliore di drawImage() chiamato con un oggetto Immagine come argomento? –

+0

Immagino che sarebbe più veloce chiamare 'drawImage()' con una tela piuttosto che convertire una tela in un URL di dati, quindi caricarla in un'immagine, quindi chiamare 'drawImage()' con quell'immagine! – andrewmu

+0

E se fosse necessario memorizzare molti stati in un array? Si dovrebbe creare una serie di un mucchio di tele ?? per esempio. 'var numBuffers = 20; var tmpCan = document.createElement ('canvas'); var buffers = [tmpCan]; for (var i = 1, len = numBuffers, i dylnmc

19

Ci sono alcuni modi per farlo theres le getImageData e putImageData metodi Reference, tuttavia putImageData e getImageData sono piuttosto lento. Un altro modo è di salvare i dati in un image in memoria e richiamarli da quello che è molto più veloce, quindi la terza è quella sopra menzionata da andrewmu che implica la copia su un altro elemento canvas. Ho incluso esempi per il primo e il secondo tipo.

Image in memory method

var canvas = document.getElementById("canvas"), 
    ctx = canvas.getContext("2d"), 
    savedData = new Image(); 

function save(){ 
    // get the data 
    savedData.src = canvas.toDataURL("image/png"); 
} 

function restore(){ 
    // restore the old canvas 
    ctx.drawImage(savedData,0,0) 
} 

getImageData putImageData method

// Setup our vars, make a new image to store the canvas data 
var canvas = document.getElementById("canvas"), 
    ctx = canvas.getContext("2d"), 
    canvasData = ''; 

function save(){ 
    // get the data 
    canvasData = ctx.getImageData(0, 0, 100, 100); 
} 

function restore(){ 
    // restore the old canvas 
    ctx.putImageData(canvasData, 0, 0); 
} 
+0

qualcuno ha perso questo? : D – JustGoscha

+0

@JustGoscha hmm non sono sicuro che immagino che se qualcuno lo avesse sarebbe Simon Sarris. L'op. – Loktar

1

immagine aggiunta in tela

var image = new Image(); 
image.src = "1.jpg"; 
image.onload = function() { 
context.drawImage(image, 0, 0); 
}; 
+0

(1) ha già inserito il canvas; quindi, non ha bisogno di sapere come caricare un'immagine su una tela dopo che carica (2) op chiedeva come "convertire" una tela in un'immagine, mantenere un riferimento a quell'immagine e in seguito, ripristinare la immagine sulla tela - che, come altri hanno sottolineato - è possibile con toDataUrl() ==> img.src o usando un canvas temporaneo. Tuttavia, la tua risposta non si avvicina davvero alla risposta alla domanda. Forse potresti rivedere o rimuovere, in modo da non confondere le persone. – dylnmc