如何检查画布是否为空
How to check if a canvas is blank?
如何检查HTML5画布是否为空白或有彩色像素。有快速的方法吗?
<canvas width="200" height="200"></canvas>
更快:使用context.getImageData()
查找"彩色"像素(非零值)
// returns true if all color channels in each pixel are 0 (or "blank")
function isCanvasBlank(canvas) {
return !canvas.getContext('2d')
.getImageData(0, 0, canvas.width, canvas.height).data
.some(channel => channel !== 0);
}
正如@Kaiido所指出的,通过枚举像素的Uint32Array
,而不是每个像素中的每个颜色通道,可以获得更好的性能。
// returns true if every pixel's uint32 representation is 0 (or "blank")
function isCanvasBlank(canvas) {
const context = canvas.getContext('2d');
const pixelBuffer = new Uint32Array(
context.getImageData(0, 0, canvas.width, canvas.height).data.buffer
);
return !pixelBuffer.some(color => color !== 0);
}
速度较慢:将数据URL与空白画布进行比较
function isCanvasBlank(canvas) {
const blank = document.createElement('canvas');
blank.width = canvas.width;
blank.height = canvas.height;
return canvas.toDataURL() === blank.toDataURL();
}
基准
演示
document.getElementById('check').addEventListener('click', function() {
const blank = isCanvasBlank(document.getElementById('canvas'));
alert(blank ? 'blank' : 'not blank');
});
document.getElementById('draw').addEventListener('click', function() {
drawOnCanvas(document.getElementById('canvas'));
});
document.getElementById('clear').addEventListener('click', function() {
const canvas = document.getElementById('canvas');
canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height);
});
function isCanvasBlank(canvas) {
const context = canvas.getContext('2d');
const pixelBuffer = new Uint32Array(
context.getImageData(0, 0, canvas.width, canvas.height).data.buffer
);
return !pixelBuffer.some(color => color !== 0);
}
function drawOnCanvas(canvas) {
const context = canvas.getContext('2d');
context.fillStyle = '#' + Math.floor(Math.random() * 0xFFFFFF).toString(16);
context.fillRect(Math.floor(Math.random() * canvas.width),
Math.floor(Math.random() * canvas.height),
Math.floor(Math.random() * canvas.width),
Math.floor(Math.random() * canvas.height));
}
canvas {
display: block;
margin-top: 10px;
border: 1px solid black;
}
<button id="check"> Check </button>
<button id="draw"> Draw </button>
<button id="clear"> Clear </button>
<canvas id="canvas" width="200" height="200"></canvas>
相关文章:
- 访问布局信息是否也会导致浏览器重排
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 如何检测是否有溢出
- jQuery中是否内置了任何字符串格式化函数
- 是否有任何snippet或jQuery插件可以列出easylist.txt模式匹配的DOM中的所有元素
- 测试索引值是否等于某个数字的倍数
- Fancybox是否将Click事件静音
- 主干-不管怎样,检查事件以前是否绑定过
- YUI3 IO实用程序是否可以根据给定的内容类型标头值自动序列化数据
- 是否有一个JS/jQuery函数可以获取某个类的每个元素的ID
- 节点是否需要模块传递带有方括号的arg?这是个错误吗
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 是否可以禁用jquery中的单个单选按钮
- 是否可以从父类访问子类的属性
- 是否可以控制获取哪些Google地图脚本(JavaScript API)
- 如何让程序检查所选单词中是否有按键
- 我如何为列出的选项卡元素编写一个Protractor测试,它会检查它是否's是否处于活动状态
- 在运行Javascript/jQuery中的函数之前,检查元素是否存在是否更具性能
- 如何比较卡布奇诺中的两个物体是否相等