J'aimerais disposer d'un contexte de canevas HTML dans lequel je peux peindre et lire à l'écran (dans cet exemple, écrire du texte et lire la forme créée, mais c'est une question générale). Je pourrais aussi vouloir utiliser un canevas comme mémoire tampon hors écran.
Je suppose que je pourrais créer un élément DOM masqué, mais que je préfère le créer à partir de JavaScript (je souhaiterais peut-être créer et détruire un certain nombre de canevas au moment de l'exécution).
Possible?
Vous pouvez créer un nouvel élément canvas
avec document.createElement
:
var canvas = document.createElement('canvas');
et ensuite obtenir le contexte de celui-ci. Assurez-vous simplement que vous avez défini width
et height
. Il n'est pas nécessaire d'ajouter la toile à l'arbre pour que cela fonctionne:
Mais vous devez absolument créer ce noeud. Vous pouvez créer une fonction pour cela si:
function createContext(width, height) {
var canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
return canvas.getContext("2d");
}
Mais c’est là que se termine ma compétence. Que vous puissiez transférer un contexte dans un autre contexte ou dans un canevas, je ne sais pas ...
C'est vieux mais qu'en est-il d'enregistrer une toile avec toDataURL et de la copier sur une autre avec drawImage. vous pouvez également utiliser save et restore pour créer un tampon d'images
function createCanvas(width, height) {
var c = document.createElement('canvas');
c.setAttribute('width', width);
c.setAttribute('height', height);
return c;
}
function canvasImg(canvas) {
var ctx = canvas.getContext('2d');
ctx.fillRect(0,0,canvas.width, canvas.height);
var img = canvas.toDataURL('image/png');
return img;
}
function placeImage(canvas, img) {
var ctx = canvas.getContext('2d');
ctx.drawImage(img, 0,0);
}
window.onload = function(){
var canvas = createCanvas(400, 400);
var hiddenCanvas = createCanvas(400,400);
var i = canvasImg(hiddenCanvas);
var img = new Image();
img.src = i;
placeImage(canvas, img);
document.body.appendChild(canvas);
}
Il y a apparemment une nouvelle chose appelée OffscreenCanvas
qui a été délibérément conçue pour ce cas d'utilisation. Un bonus supplémentaire est que cela fonctionne également dans les travailleurs Web.
Vous pouvez lire les spécifications ici: https://html.spec.whatwg.org/multipage/canvas.html#the-offscreencanvas-interface
Et voyez des exemples ici: https://developer.mozilla.org/en-US/docs/Web/API/OffscreenCanvas
Actuellement, il est uniquement pris en charge par Chrome et est disponible derrière les drapeaux dans Firefox et Opera, mais vous pouvez toujours consulter les informations les plus récentes sur les navigateurs pris en charge ici: https://caniuse.com/#feat=offscreencanvas
ps .: Google propose également un guide dédié expliquant son utilisation dans Web Workers: https://developers.google.com/web/updates/2018/08/offscreen-canvas