有什么方法可以克隆 HTML5 画布元素及其内容?

IT技术 javascript html canvas clone
2021-01-18 20:25:03

有没有办法用所有绘制的内容创建画布元素深层副本?

2个回答

实际上,复制画布数据的正确方法是将旧画布传递给新的空白画布。试试这个功能。

function cloneCanvas(oldCanvas) {

    //create a new canvas
    var newCanvas = document.createElement('canvas');
    var context = newCanvas.getContext('2d');

    //set dimensions
    newCanvas.width = oldCanvas.width;
    newCanvas.height = oldCanvas.height;

    //apply the old canvas to the new one
    context.drawImage(oldCanvas, 0, 0);

    //return the new canvas
    return newCanvas;
}

使用 getImageData 用于像素数据访问,而不是用于复制画布。在浏览器上使用它进行复制非常缓慢且困难。应该避免。

ok 发现错误:newCanvas.width = oldCanvas.width; newCanvas.height = oldCanvas.height;调用drawImage()函数需要设置
2021-03-14 20:25:03
@trysis没错,getImageData除非您需要访问原始数据,否则没有必要使用when ,例如您想将数据转储到某处或某处。让 drawImage 方法完成工作要快得多。
2021-03-16 20:25:03
是的,更改画布的尺寸会丢弃图像数据。
2021-03-19 20:25:03
+1 在drawImage()参考上,但值得注意的是,对 的调用new Canvas()不适用于所有浏览器(尤其是 Firefox) - 相反,您应该使用document.createElement('canvas')
2021-04-04 20:25:03
这里有一个非常奇怪的错误:当加载图像并相应地调整画布的大小然后克隆它时,它只会克隆前300 像素(水平)和前150 像素(垂直)(参见peter.muehlbacher.me/playground/mycelium? src=../downloads/...单击时控制台 - 它记录副本的 alpha 值)
2021-04-09 20:25:03

你可以打电话

context.getImageData(0, 0, context.canvas.width, context.canvas.height);

这将返回一个 ImageData 对象。它有一个名为数据属性,类型为 CanvasPixelArray,其中包含所有像素的 rgb 和透明度值。这些值不是对画布的引用,因此可以在不影响画布的情况下进行更改。

如果您还需要该元素的副本,您可以创建一个新的 canvas 元素,然后将所有属性复制到新的 canvas 元素中。之后,您可以使用

context.putImageData(imageData, 0, 0);

方法将 ImageData 对象绘制到新的画布元素上。

请参阅此答案以获取更多详细信息getPixel from HTML Canvas?关于操作像素。

您可能会发现这篇 mozilla 文章也很有用https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Canvas_tutorial/Drawing_shapes

不是一个很好的复制方法。这更适合于数据存储。
2021-03-13 20:25:03