javascript - 如何检查 Canvas 是否为空白?

标签 javascript html canvas

<分区>

如果 HTML5 Canvas 是空白的或有彩色像素,我该如何检查。有没有快速的方法?

<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 获得更好的性能像素而不是每个像素中的每个颜色 channel 。

// 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 与空白 Canvas 进行比较

function isCanvasBlank(canvas) {
  const blank = document.createElement('canvas');

  blank.width = canvas.width;
  blank.height = canvas.height;

  return canvas.toDataURL() === blank.toDataURL();
}

Benchmark

演示

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>

关于javascript - 如何检查 Canvas 是否为空白?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17386707/

相关文章:

html - 与 AngularJS 相比,在 Polymer 中使用创建自定义 HTML5 元素/小部件的优缺点是什么

javascript - 如何在 Canvas 上捕获按键事件而不干扰网站的其余部分?

javascript - 我如何创建一个实时表单,它可以并排显示我在设计中填写的任何内容?

javascript - 如何通过更改页面方向从 JavaScript 生成 Word 文档? (纵向到横向)

javascript - 将许多表单输入值从子窗口传递到父窗口的更好方法

jquery - 将表行复制到另一个表 html

javascript - 响应式网站

javascript - ReactJS 调用父方法

javascript - 如何合并 fabrcjs 中的触摸路径?

javascript - 使用 "<select></select>"表单调整 html5 Canvas 的大小