如何检查是否在画布上绘制了某些内容

Mar*_*vzz 26 javascript html5 canvas

如何检查画布上是否有数据或某些内容?

我有这个<canvas id="my-canvas"></canvas>元素,我想检查我的画布上是否画了一些东西.

got*_*les 28

我找到的一个好方法是使用该toDataURL()函数并将其与另一个空白画布进行比较.如果它们不同,那么你要比较它的东西就有了它.像这样的东西:

canvas = document.getElementById('editor');
ctx = canvas.getContext('2d');

canvas.addEventListener('mousemove',function(e){
    ctx.lineTo(e.pageX,e.pageY);
    ctx.stroke();
});

document.getElementById('save').addEventListener('click',function(){
    if(canvas.toDataURL() == document.getElementById('blank').toDataURL())
        alert('It is blank');
    else
        alert('Save it!');
});
Run Code Online (Sandbox Code Playgroud)

这是一个小提琴

我不能相信这一点,我只是偶然发现了它并解决了我同样的问题.也许这会在某些时候帮助某人.


Sim*_*ris 15

而不是检查每个单个像素,仅在每次画布被填充或描边时记录可能更有效.

一旦填充或中风或已经发生,那么你就知道已经绘制了一些东西.

当然'how'是非常特定于应用程序的,因为我们不知道如何首先绘制画布.


小智 10

到目前为止,我还没有在Stackoverflow中看到过这样的问题..但是有趣的一个回答..

只有这样,(我猜)是由像素通过像素检查,即检查R, G, B, A每一个像素的,
如果这些值都等于零,那么我们可以说,像素是空的..
这是我以前写的技术下面的代码片段..只是通过它

window.onload = function() {
  var canvas  = document.getElementById('canvas');
  if(!canvas.getContext) return;
  var ctx     = canvas.getContext('2d');
  var w       = canvas.width = canvas.height = 100;
  var drawn   = null;
  var d       = ctx.getImageData(0, 0, w, w); //image data 
  var len     = d.data.length;
  for(var i =0; i< len; i++) {
    if(!d.data[i]) {
      drawn = false;
    }else if(d.data[i]) {
      drawn = true;
      alert('Something drawn on Canvas');
      break;
    }
  }
  if(!drawn) {
    alert('Nothing drawn on canvas.. AKA, Canvas is Empty');
  }
}
Run Code Online (Sandbox Code Playgroud)

在这里测试一下

  • 1)set drawn = false,如果遇到!0,则设置为true 2)从图像中分离数据:var imgData = d.data但更好:3)cherry:使用Int32Array一次性测试4个组件:var arr32 = new Int32Array(d.data.buffer); len = arr32.length; 你的速度将提高4倍以上.(while((i <len)&&!arr32 [i ++]){}; drawn =(i!= len);是这个的紧凑代码:-)) (2认同)