canvas 视频马赛克

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>视频马赛克</title>
  <style>
    *{
      margin: 0;
      padding: 0;
    }
    canvas{
      border: 1px #f00 solid;
      display: block;
      margin: 20px auto;
    }
  </style>
</head>
<body>
  <canvas id="myCanvas" width="600" height="400"></canvas>
  <button id="play">播放视频</button>
  <button id="pause">暂停视频</button>
  <button id="square">方形马赛克</button>
  <button id="circle">圆形马赛克</button>
  <button id="clear">高清无码</button>
</body>
</html>
<script>
  /** @type {HTMLCanvasElement} **/
  const canvas = document.getElementById('myCanvas');
  const ctx = canvas.getContext('2d');

  let play = document.querySelector('#play');
  let video = document.createElement('video');
  let timmer = null;
  let square = document.querySelector('#square');
  let circle = document.querySelector('#circle');
  let clear = document.querySelector('#clear');


  
  video.src = '/video/1.mp4';

  //设置是否有马赛克
  let hasMosaic = true;

  //马赛克的类型 square方形, circle圆型
  let type = 'square';


  // 监听播放是否能够播放
  video.addEventListener('canplay', function() {
    // 点击播放按钮,开始播放视频
    play.addEventListener('click', function() {
      video.play();
      playCanvas();
    });
  });

  //播放视频
  function playCanvas() {
    ctx.drawImage(video, 0, 0, canvas.width, canvas.height);

    // 判断是否有马赛克
    if (hasMosaic) {
      //获取canvas中的imageData对象
      let imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
      //获取所有像素点的数组
      let arr = imageData.data;

      //清除原来的图片
      ctx.clearRect(0, 0, canvas.width, canvas.height);

      //设置5*5的格子
      let w = 9;
      let h = 9;
      //计算出行和列的总数
      let rows = Math.floor(canvas.height / h);
      let cols = Math.floor(canvas.width / w);

      //遍历每一个小格子
      for (let i = 0; i < rows; i++) {
        for (let j = 0; j < cols; j++) {
          //获取小格子中心点的坐标
          let x = j * w + Math.ceil(w / 2);
          let y = i * h + Math.ceil(h / 2);
          //计算坐标点在数组中的下标
          let pos = (y-1) * canvas.width*4 + (x-1) * 4;

          let r = arr[pos];
          let g = arr[pos+1];
          let b = arr[pos+2];

          ctx.fillStyle = `rgb(${r},${g},${b})`;
          //判断类型,方形还是圆形
          if (type ==='square') {
            ctx.fillRect(x-Math.ceil(w/2), y-Math.ceil(h/2), w, h);
          } else {
            ctx.beginPath();
            ctx.arc(x, y, Math.ceil(w/2), 0, 2 * Math.PI);
            ctx.fill();
          }
        }
      }
    }
    timmer =  requestAnimationFrame(playCanvas);
  }


  // 点击暂停按钮,暂停视频
  let pause = document.querySelector('#pause');
  pause.addEventListener('click', function() {
    video.pause();
    cancelAnimationFrame(timmer);
  });


  //点击方形马赛克
  square.addEventListener('click', function() {
    type ='square';
    hasMosaic = true;
  });

  //点击圆形马赛克
  circle.addEventListener('click', function() {
    type = 'circle';
    hasMosaic = true;
  });

  //点击高清无码
  clear.addEventListener('click', function() {
    hasMosaic = false;
  });

  


</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值