使用canvas截取web camera指定区域,并生成图片

目标,截取红色色块背后的视频区域。

代码结构如下:

html 复制代码
<div id="p1">
  <video id="v1" autoplay playsinline></video>
  <div id="mrz"></div>
  <canvas id="captureCanvas"></canvas>
</div>
<button id="screenshot-btn">截图</button>
<img id="screenshot" src="" alt="screenshot">

核心代码是确定截取坐标及大小。

javascript 复制代码
// 定义截图函数
async function takeScreenshot() {
  // 获取视频元素
  const video = document.getElementById('v1');

  // 获取 mrz 区域的位置和尺寸
  const mrzRect = document.getElementById('mrz').getBoundingClientRect();
  const mrzWidth = mrzRect.width;
  const mrzHeight = mrzRect.height;

  // 设置 canvas 大小为 mrz 区域的大小
  const canvas = document.getElementById('captureCanvas');
  canvas.width = mrzWidth;
  canvas.height = mrzHeight;

  // 获取 canvas 的 2D 上下文
  const ctx = canvas.getContext('2d');

  // 清除 canvas
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  // 获取视频元素的位置
  const videoRect = video.getBoundingClientRect();

  // 获取 mrz 区域相对于视频的位置
  const mrzX = mrzRect.left - videoRect.left;
  const mrzY = mrzRect.top - videoRect.top;

  // 计算视频流的像素比例
  const videoScaleX = videoRect.width / video.videoWidth;
  const videoScaleY = videoRect.height / video.videoHeight;

  // 计算原始视频坐标
  const originalMrzX = Math.round(mrzX / videoScaleX);
  const originalMrzY = Math.round(mrzY / videoScaleY);

  // 确保原始坐标正确
  const finalMrzX = Math.max(0, originalMrzX);
  const finalMrzY = Math.max(0, originalMrzY);

  // 使用 drawImage 方法绘制指定区域到 canvas 上
  ctx.drawImage(
    video,
    finalMrzX, finalMrzY, // 源图像的起始坐标
    mrzWidth / videoScaleX, mrzHeight / videoScaleY, // 源图像的宽度和高度
    0, 0, // 目标图像的起始坐标
    mrzWidth, mrzHeight // 目标图像的宽度和高度
  );

  // 生成图片
  const dataUrl = canvas.toDataURL();
  document.getElementById('screenshot').src = dataUrl;
}

最关键的就是这段代码:

javascript 复制代码
// 使用 drawImage 方法绘制指定区域到 canvas 上
  ctx.drawImage(
    video,
    finalMrzX, finalMrzY, // 源图像的起始坐标
    mrzWidth / videoScaleX, mrzHeight / videoScaleY, // 源图像的宽度和高度
    0, 0, // 目标图像的起始坐标
    mrzWidth, mrzHeight // 目标图像的宽度和高度
  );

实际应用的时候可能截取的区域不是很准确,有偏差,这时候可以通过调整起始坐标位置和源图像的宽高,来调整截图区域,使截出来的图片更准确。

相关推荐
吃饺子不吃馅7 分钟前
AntV X6图编辑器如何实现切换主题
前端·svg·图形学
余防1 小时前
XXE - 实体注入(xml外部实体注入)
xml·前端·安全·web安全·html
jump_jump1 小时前
前端部署工具 PinMe
运维·前端·开源
Baklib梅梅1 小时前
优秀文档案例解析:打造高效用户体验的最佳实践
前端·ruby on rails·前端框架·ruby
慧一居士1 小时前
VUE、jquery、React、Ant Design、element ui、bootstrap 前端框架的 功能总结,示例演示、使用场景介绍、完整对比总结
前端
GISer_Jing1 小时前
0926第一个口头OC——快手主站前端
开发语言·前端·javascript
MediaTea3 小时前
Jupyter Notebook:基于 Web 的交互式编程环境
前端·ide·人工智能·python·jupyter
少年阿闯~~3 小时前
CSS——重排和重绘
前端
个人看法3 小时前
h5实现一个吸附在键盘上的工具栏
前端·javascript·vue
知识分享小能手4 小时前
微信小程序入门学习教程,从入门到精通,微信小程序页面制作(2)
前端·javascript·学习·微信小程序·小程序·前端框架·notepad++