如何将一个canvas的内容复制到另一个canvas本地
我想复制一个canvas的所有内容,并将它们转移到客户端的所有内容。 我会认为我会使用canvas.toDataURL()
和context.drawImage()
方法来实现这一点,但我遇到了一些问题。
我的解决scheme是获取Canvas.toDataURL()
并将其存储在Javascript中的Image对象中,然后使用context.drawImage()
方法将其放回。
但是,我相信toDataURL
方法返回一个带有"data:image/png;base64,"
的64位编码标签。 这似乎不是一个有效的标签,(我总是可以使用一些正则expression式来删除这个),但是是64位编码的string之后的"data:image/png;base64,"
子string有效的图像? 我可以说image.src=iVBORw...ASASDAS
,并在canvas上画回来吗?
我已经看了一些相关的问题: 使用base64将canvas图像从一个canvas显示到另一个canvas
但解决scheme似乎并不正确。
其实你根本不需要创build一个图像。 drawImage()
将接受一个Canvas
以及一个Image
对象。
//grab the context from your destination canvas var destCtx = destinationCanvas.getContext('2d'); //call its drawImage() function passing it the source canvas directly destCtx.drawImage(sourceCanvas, 0, 0);
比使用ImageData
对象或Image
元素快得多。
请注意, sourceCanvas
可以是HTMLImageElement , HTMLVideoElement或HTMLCanvasElement 。 正如Dave在下面的评论中提到的,你不能使用canvas上下文作为你的源代码 。 如果您有一个canvas描画上下文,而不是从其创build的canvas元素,则会在context.canvas
下的上下文中引用原始canvas元素。
这里是一个jsPerf来演示为什么这是克隆一个canvas的唯一正确的方法: http : //jsperf.com/copying-a-canvas-element
@ robert-hurst有一个更清晰的方法,但是这个解决scheme可能会在你真正想复制Data Url后复制的地方使用。 示例:当您构build使用大量图像/canvas操作的网站时。
// select canvas elements var sourceCanvas = document.getElementsById("some-unique-id"); var destCanvas = document.getElementsByClassName("some-class-selector")[0]; //copy canvas by DataUrl var sourceImageData = sourceCanvas.toDataURL("image/png"); var destCanvasContext = destCanvas.getContext('2d'); var destinationImage = new Image; destinationImage.onload = function(){ destCanvasContext.drawImage(destinationImage,0,0); }; destinationImage.src = sourceImageData;
我设法得到它的工作,我所做的似乎是正确的:
testImage = new testImage(); testImage.src = data:image/png;base64,iVBORw0KG......kSZIkSZIkSZI0u/1/diDteJCiN80AAAAASUVORK5CYII=
(上面的URL是一个例子)
context.drawImage(testImg,0,0);
当我在Chrome和FireBug的控制台上运行它时,这似乎工作