我遇到了toDataURL();
方法的问题。我正在尝试保存画布的图像,以便在我调整浏览器/画布大小时,它可以再次出现在我的画布背面(作为解决方法,因为无论何时设置画布的宽度,它都会清除它)然后继续我写的“绘图”功能,但是在不同大小的画布上。通过这种方式,我可以无需清除它就能无缝调整画布大小。
在我的代码中,toDataURL();
要么似乎没有保存图像,要么我在调整画布大小时调用它是错误的。我只是将源设置为普通的.png文件进行检查,这似乎在后面正确绘制。我之前发现了这个问题,但我找不到满意的答案......
JS
canvas.onmousemove = draw;
var ctx = canvas.getContext('2d');
var video = document.createElement("video");
video.setAttribute("src", "some_video.mp4");
video.autoplay = true;
var img2 = new Image;
img2.src = "some_image.png";
var dataURL = canvas.toDataURL();
ctx.canvas.width = window.innerWidth;
ctx.canvas.height = window.innerHeight;
function draw(e){
var rect = canvas.getBoundingClientRect();
var x = e.clientX-rect.left-img2.width/2;
var y = e.clientY-rect.top-img2.height/2;
ctx.drawImage(video, x, y, 830, 644);
ctx.drawImage(img2, x, y, img2.width, img2.height);
}
$(window).resize(function(){
var image = new Image;
image.src = dataURL;
ctx.canvas.width = window.innerWidth;
ctx.canvas.height = window.innerHeight;
ctx.drawImage(image, 0, 0);
draw();
});
答案 0 :(得分:0)
我不确定您打算如何处理剪切内容,因为如果调整大小已关闭,您的代码将转储所有下方和新画布分辨率右侧的像素。所以我认为你还没有想过。
您需要做的是将画布保持在屏幕外,设置为您想要的分辨率。然后使用显示画布作为渲染的视图和鼠标输入的事件目标,并在屏幕外画布上绘制所有功能。这样你就可以调整你想要的所有内容,而不必使用toDataURL(它不适用于那种类型的使用,因为resize事件可以每秒激发很多次并且toDataURL编码和解码将无法跟上)
创建离屏画布
var can = document.createElement("canvas");
can.width = width;
can.height = height;
ctx = can.getContext("2d");
每当您更新屏幕外的画布时,将其渲染到屏幕画布上,或调整窗口大小。
scrCtx.drawImage(can,0,0); //scrCtx is the on screen ctx
您还可以获得额外的好处,即能够在不影响背景图像质量的情况下缩放,平移和旋转视图。它很快。 toDataURL用于通过网络和存储设备进行数据传输,而不是作为ram缓冲区。