toDataURL();不保存图像?

时间:2015-11-15 22:55:31

标签: javascript jquery canvas

我遇到了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();
        });

1 个答案:

答案 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缓冲区。