2011-08-30 29 views
15

que tiene implantado un zoom dentro y fuera de función en un elemento canvas. funciona escalando el lienzo, traduciéndolo, y luego vuelve a dibujar toda la escena. el problema es que lleva mucho tiempo volver a dibujar todo porque tengo muchas cosas en mi lienzo.html5: copiar un lienzo de la imagen y volver

necesito una manera de copiar el lienzo a un objeto de imagen y de copiar la imagen de nuevo a la lona sin perder calidad. ¿Cuáles son los métodos específicos para copiar el lienzo a una variable de javascript y para copiar esta variable al lienzo más tarde?

Me alegraré si usted escribe el código porque no podía encontrar ninguna buena explicación en internet.

gracias,

+0

¿Quieres restaurar la imagen con zoom, o como el tamaño o ¿Por último fue? – Loktar

+0

No, la única forma de "conservar la calidad" en un mapa de bits es volver a dibujar. No hay forma mágica de agregar píxeles adicionales en el mapa de bits ampliado sin dibujar realmente esos píxeles. Si desea acercar y alejar manteniendo la nitidez, utilice SVG (vector) en lugar de Canvas (mapa de bits). – robertc

+1

Ok, he hecho pruebas de rendimiento para todos los métodos en las respuestas a continuación. El drawImage() desde otro lienzo parece ser el más rápido: http://jsperf.com/canvas-image-store-restore – JustGoscha

Respuesta

26

El método drawImage() pueden dibujar a un lienzo con otro lienzo en lugar de una imagen.

Se puede crear un lienzo 'copia de seguridad', del mismo tamaño que el original, dibujar el primero allí y luego dibujar que uno nuevo a la original cuando lo necesite.

p. Ej.

// 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

¿Es drawImage() se llama con lienzo como un parámetro mejor que drawImage() se llama con un objeto de imagen como argumento? –

+0

me imagino que sería más rápido que llamar 'drawImage()' con un lienzo de convertir un lienzo a una URL de datos, a continuación, cargarlo en una imagen, a continuación, llamar 'drawImage()' con esa imagen! – andrewmu

+0

¿Qué sucede si necesita almacenar muchos estados en una matriz? ¿Debería uno crear una matriz de un montón de lienzos? p.ej. 'var numBuffers = 20; var tmpCan = document.createElement ('canvas'); var buffers = [tmpCan]; for (var i = 1, len = numBuffers, i dylnmc

19

Hay algunas maneras de hacer que los theres getImageData y putImageData métodos Reference, Sin embargo putImageData y getImageData son bastante lento. Otra forma es guardar la información en un image en la memoria y recuperarla de la que es mucho más rápida, entonces la tercera forma es la mencionada anteriormente por andrewmu que implica copiar a otro elemento canvas. He incluido ejemplos para el primer y segundo 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

¿Alguien jsperfed esto? : D – JustGoscha

+0

@JustGoscha hmm no estoy seguro de que si alguien lo tiene sería Simon Sarris. – Loktar

1

imagen añadida en lienzo

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

(1) op ya tiene lienzo poblado; entonces, él/ella no necesita saber cómo cargar una imagen en un lienzo después de que se carga (2) op preguntaba cómo "convertir" un lienzo en una imagen, mantener una referencia a esa imagen y más adelante, restaurar el imagen en el lienzo, que, como han señalado otros, es posible con toDataUrl() ==> img.src o utilizando un lienzo temporal. Sin embargo, su respuesta realmente no se acerca a responder la pregunta. Tal vez podría revisar o eliminar, para no confundir a las personas. – dylnmc

Cuestiones relacionadas