2.9.3 替换视频背景

代码清单2-62将视频内容绘制在canvas上,使用getImageData()方法获取视频的像素数据,然后遍历所有像素。如果像素RGB大于(150,150,150),说明像素偏白色,则使用背景图片对应的像素进行替换,最后将替换后的数据重新绘制在canvas上。

代码清单2-62 替换视频背景

computeFrame() {
  this.ctx1.drawImage(this.video, 0, 0, this.width, this.height);
  let frame = this.ctx1.getImageData(0, 0, this.width, this.height);
  let l = frame.data.length / 4;

  for (let i = 0; i < l; i++) {
    let r = frame.data[i * 4 + 0];
    let g = frame.data[i * 4 + 1];
    let b = frame.data[i * 4 + 2];
    let a = frame.data[i * 4 + 3];

    if ( r > 150 && g > 150 && b > 150) {
      frame.data[i * 4 + 0] = this.imageFrame.data[i*4 + 0];
      frame.data[i * 4 + 1] = this.imageFrame.data[i*4 + 1];
      frame.data[i * 4 + 2] = this.imageFrame.data[i*4 + 2];
    }
  }
  this.ctx2.putImageData(frame, 0, 0);
}