我想要一个 HTML 画布上下文,我可以在屏幕外绘制和阅读(在这个例子中,写文本和阅读创建的形状,但这是一个普遍的问题)。我可能还想使用画布作为屏幕外帧缓冲区。
我想我可以创建一个隐藏的 DOM 元素,但我宁愿从 JavaScript 创建它(我可能想在运行时创建和销毁一些画布)。
可能的?
我想要一个 HTML 画布上下文,我可以在屏幕外绘制和阅读(在这个例子中,写文本和阅读创建的形状,但这是一个普遍的问题)。我可能还想使用画布作为屏幕外帧缓冲区。
我想我可以创建一个隐藏的 DOM 元素,但我宁愿从 JavaScript 创建它(我可能想在运行时创建和销毁一些画布)。
可能的?
您可以使用以下命令创建新canvas
元素document.createElement
:
var canvas = document.createElement('canvas');
然后从中获取上下文。只要确保你设置了width
and height
。您不必将画布添加到树中即可使其工作:
但是您绝对必须创建该节点。您可以为此创建一个函数:
function createContext(width, height) {
var canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
return canvas.getContext("2d");
}
但这就是我的能力结束的地方......你是否可以以某种方式将上下文转移到另一个上下文或画布,我不知道......
它很旧,但是如何使用 toDataURL 保存一个画布并使用 drawImage 复制到另一个画布。您还可以使用 save 和 restore 来制作帧缓冲区
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);
}
显然有一个新的东西OffscreenCanvas
是专门为这个用例设计的。另一个好处是它也适用于 Web Workers。
您可以在此处阅读规范:https ://html.spec.whatwg.org/multipage/canvas.html#the-offscreencanvas-interface
并在此处查看示例:https ://developer.mozilla.org/en-US/docs/Web/API/OffscreenCanvas
目前,它仅由 Chrome 完全支持,并且在 Firefox 和 Opera 的标志后面可用,但您始终可以在此处查看有关受支持浏览器的最新信息:https ://caniuse.com/#feat=offscreencanvas
ps.:Google 也有专门的指南解释它在 Web Workers 中的使用:https ://developers.google.com/web/updates/2018/08/offscreen-canvas
CanvasRenderingContext2D 和 WebGLRenderingContext 类都有与它们关联的画布元素作为属性canvas
;而且,像往常一样,当您的代码在运行时不再引用它们时,上下文实例及其画布都将被垃圾收集。
你可以使用这个函数来创建一个新的上下文
function newContext({width, height}, contextType = '2d') {
const canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
return canvas.getContext(contextType);
}
const ctx = newContext({width: 100, height: 100});
console.log(ctx.canvas.width == 100) // true
通过使用取消引用,您可以轻松地创建 DOM 画布的克隆以进行帧缓冲,如下所示:
const domCanvas = document.getElementById('myCanvas');
const frameBuffer = newContext(domCanvas);
frameBuffer.drawImage(domCanvas, 0, 0);
这将创建一个与传入的画布元素具有相同宽度和高度的上下文。您可以根据需要扩展该函数。