2010-10-08 17 views
9

Actualmente estoy buscando una manera de crear un contexto de representación 2D de canvas sin tener realmente un elemento canvas en la página. Pude crear dinámicamente un elemento canvas y ocultarlo, pero no quiero mostrar la imagen directamente al usuario en cualquier momento, por lo que no tiene sentido tener un elemento canvas en la página. Así que estoy básicamente en busca de algo que es similar aCrear contexto 2d * sin * canvas

var image = new Image(); 

pero sólo por contexto de representación 2D de la lona (pseudo código)

var context = new 2dContext(); 

¿Existe la funcionalidad de esta manera? No pude encontrar nada parecido. Llamando

var context = new CanvasRenderingContext2D(); 

que es el nombre de la interfaz contexto de representación de especificación HTML5 sólo me da errores torpes en Firefox:

uncaught exception: [Exception... "Cannot convert WrappedNative to function" nsresult: "0x8057000d (NS_ERROR_XPC_CANT_CONVERT_WN_TO_FUN)" location: "JS frame :: http://localhost/ :: <TOP_LEVEL> :: line 25" data: no] 
+1

¿Cuál es el punto del contexto, entonces? puede haber una mejor manera de lograr lo que quiere hacer sin usar un contexto. ¿Qué te hizo decidir usar un contexto y cuál es la necesidad? –

+0

Estoy desarrollando una implementación basada en navegador de un juego de mesa que usa lienzo para dibujar su tablero. Una característica importante es que el tablero es realmente más grande que su ventana gráfica, por lo que debe ser capaz de desplazarse. La panoramización requiere velocidades de actualización muy altas para que se vean sin problemas y las implementaciones actuales de ECMA Script + Canvas simplemente no proporcionan ese rendimiento. Así que iba a utilizar un enfoque de almacenamiento en búfer que dibujaría toda la placa en un contexto invisible, cada vez que algo cambia y recortar partes de ese contexto en el lienzo de la ventana gráfica para (dramáticamente) aumentar las tasas de actualización. –

+0

Si no necesita nada * demasiado * sofisticado/complejo, generalmente puede salirse con la suya usando/abusando de HTML en lugar de buscar, digamos una solución SVG, o cualquier otra cosa que no sea 'canvas 'para ese asunto. –

Respuesta

18

Es posible utilizar un lienzo sin mostrarlo en la página. Se podría hacer lo siguiente:

// Create a canvas element 
var canvas = document.createElement('canvas'); 
canvas.width = 500; 
canvas.height = 400; 

// Get the drawing context 
var ctx = canvas.getContext('2d'); 

// Then you can do stuff, e.g.: 
ctx.fillStyle = '#f00'; 
ctx.fillRect(20,10,80,50); 

vez que haya utilizado el lienzo, se puede, por supuesto, añadirlo al documento

var element = document.getElementById('canvas_container'); 
element.appendChild(canvas); 

O usted podría hacer una imagen de ella:

var new_image_url = canvas.toDataURL(); 
var img = document.createElement('img'); 
img.src = new_image_url; 

O puede acceder a los datos de la lona como valores con:

var image_data = ctx.getImageData(0,0,canvas.width,canvas.height); 
var rgba_byte_array = image_data.data; 
rgba_byte_array[0]; // red value for first pixel (top left) in the canvas 
+0

Gracias por la respuesta. Era consciente de este método, pero sentía que no era exactamente lo que estaba buscando. Propablemente, aunque esta es mi mejor apuesta. –

+3

Desafortunadamente, esto no funciona dentro de WebWorkers, que es mi necesidad personal. No tienen acceso al DOM, pero quiero hacer algunas operaciones de dibujo en un hilo de fondo. – Alastair

3

Curiosamente, si crea un objeto canvas y almacena su contexto en una variable, esa variable tiene su propio puntero al objeto canvas. Como no puede usar getContext ("2d") sin un lienzo, también podría tener un solo puntero de lienzo. Si eres como yo y odio tener unos dos referencias al mismo objeto, se puede hacer esto:

original:

var canvas=document.createElement("canvas"); 
var context=canvas.getContext("2d"); 

alert(Boolean(context.canvas==canvas));// true. 

Lo que estoy hablando:

var context=document.createElement("canvas").getContext("2d"); 

alert(context.canvas);// The canvas object. 

Ahora puede hacer todas sus cosas importantes de lienzo a través de la variable de contexto. Después de todo, se accede al contexto con más frecuencia que la variable canvas. Cuando lo necesita simplemente hacer referencia a ella a través del contexto:

context.canvas.width=320; 
context.canvas.height=320; 
document.body.appendChild(context.canvas); 

Y si usted no quiere preocuparse por el lienzo acaba de salir de la variable por sí solo, no es como si quisiera utilizar de todos modos.

0

¿Qué te parece: OffscreenCanvas()?

Y la respuesta es probablemente no, ya que esto solo es compatible con Firefox 44.0+ actualmente.

var offscreen = new OffscreenCanvas(256, 256); 

https://developer.mozilla.org/en-US/docs/Web/API/OffscreenCanvas

https://html.spec.whatwg.org/multipage/scripting.html#the-offscreencanvas-interface

(añadido como referencia aquí, ya que esto puede ser nuevo para la especificación ya que esta pregunta se hizo hace más de 6 años! Y espero que será más ampliamente adoptado)

Cuestiones relacionadas