如何检查画布上是否有数据或图像?
我有这个<canvas id="my-canvas"></canvas>
元素,并且我想检查我的画布上是否有东西被绘制。
如何检查画布上是否有数据或图像?
我有这个<canvas id="my-canvas"></canvas>
元素,并且我想检查我的画布上是否有东西被绘制。
我发现一个好方法是使用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!');
});
这里有一个示例
我不能为此负责,我只是偶然发现它,并且解决了我相同的问题。也许这会在某个时候帮助到某人。
不是检查每个像素,仅记录画布何时被填充或描边可能更高效。
一旦发生填充或描边,您就知道有东西被绘制了。
当然,“如何”非常应用程序特定,因为我们不知道您的画布首先是如何被绘制的。
我在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');
}
}
HTML代码:
<canvas id='mainCanvas' style='border:solid'></canvas>
<canvas id='blankCanvas' style='display:none'></canvas>
JS 代码:
var mainCanvas= new SignaturePad(document.getElementById("mainCanvas"));
if (mainCanvas.toDataURL() == document.getElementById('blankCanvas').toDataURL()) {
// Canvas is blank
}
嘿,可能有点晚回答,但我感到需要额外的画布来进行比较,这让我感到有些恐慌。所以这是我的解决方案:
if (canvas.toJSON().objects.length === 0) {
console.log('canvas is empty');
}
我希望这能帮到你,你可以用它来创建一个函数,但解决方案比我之前见过的更加干净。
这里有一个来自Phrogz的提示:https://dev59.com/z2445IYBdhLWcg3w5OEH#4649358
function eventOnDraw( ctx, eventName ){
var fireEvent = function(){
var evt = document.createEvent("Events");
evt.initEvent(eventName, true, true);
ctx.canvas.dispatchEvent( evt );
}
var stroke = ctx.stroke;
ctx.stroke = function(){
stroke.call(this);
fireEvent();
};
var fillRect = ctx.fillRect;
ctx.fillRect = function(x,y,w,h){
fillRect.call(this,x,y,w,h);
fireEvent();
};
var fill = ctx.fill;
ctx.fill = function(){
fill.call(this);
fireEvent();
};
}
...
var myContext = someCanvasElement.getContext('2d');
someCanvasElement.addEventListener( 'blargle', myHandler, false );
eventOnDraw( myContext, 'blargle' );
function isDrawnOn() {
var imageData = context.getImageData(0, 0, canvas.width, canvas.height);
var data = imageData.data;
var result = null;
var counter = 0;
var last = data.length - 1;
for (var i = 0; i < data.length; i++) {
if (i === last && counter !== 0 && counter === last) {
result = false;
break;
} else if (data[i] !== 0 && data[i] > 0) {
result = true;
break;
} else {
counter++;
continue;
}
}
return result;
}
我希望这有所帮助 :)