菜鸟-创作你的创作

html5调用摄像头截图功能

阿杰,你想用 HTML5 调用摄像头并截图,可以直接使用 getUserMedia + <video> + <canvas> 实现。下面给你一个完整示例:


&lt;!DOCTYPE html>
&lt;html lang="zh-CN">
&lt;head>
&lt;meta charset="UTF-8">
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0">
&lt;title>HTML5 摄像头截图 Demo&lt;/title>
&lt;style>
  body { text-align: center; font-family: Arial; background: #f0f0f0; }
  video, canvas { border: 1px solid #ccc; margin-top: 20px; }
  button { margin-top: 10px; padding: 10px 20px; font-size: 16px; }
&lt;/style>
&lt;/head>
&lt;body>

&lt;h1>摄像头截图&lt;/h1>

&lt;video id="video" width="400" height="300" autoplay playsinline>&lt;/video>
&lt;br>
&lt;button id="snap">拍照&lt;/button>
&lt;br>
&lt;canvas id="canvas" width="400" height="300">&lt;/canvas>

&lt;script>
const video = document.getElementById('video');
const canvas = document.getElementById('canvas');
const context = canvas.getContext('2d');
const snapButton = document.getElementById('snap');

// 1️⃣ 获取摄像头视频流
navigator.mediaDevices.getUserMedia({ video: true, audio: false })
  .then(stream => {
    video.srcObject = stream;
    video.play();
  })
  .catch(err => {
    alert('摄像头无法访问: ' + err);
  });

// 2️⃣ 点击按钮截图
snapButton.addEventListener('click', () => {
  context.drawImage(video, 0, 0, canvas.width, canvas.height);
  // 可将截图转为 base64
  const dataURL = canvas.toDataURL('image/png');
  console.log(dataURL);
});
&lt;/script>

&lt;/body>
&lt;/html>


✅ 特性说明

  1. navigator.mediaDevices.getUserMedia
    • 请求摄像头权限
    • { video: true, audio: false } 表示只开启摄像头
  2. <video>
    • 用于实时显示摄像头画面
    • playsinline 避免 iOS 自动全屏
  3. <canvas> + drawImage
    • 用于截图
    • 可以生成 base64 图像用于上传或保存
  4. 移动端兼容
    • playsinline 必须在 iOS Safari 上保持内嵌播放
    • 安卓、桌面浏览器直接支持

🔹 扩展功能

const link = document.createElement('a');
link.href = canvas.toDataURL('image/png');
link.download = 'snapshot.png';
link.click();

context.filter = 'grayscale(100%)';
context.drawImage(video, 0, 0, canvas.width, canvas.height);

明白了,阿杰!下面给你一个 完整 HTML5 摄像头截图 + 滤镜特效 + 上传后台 Demo,特点如下:


&lt;!DOCTYPE html>
&lt;html lang="zh-CN">
&lt;head>
&lt;meta charset="UTF-8">
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0">
&lt;title>摄像头截图+滤镜+上传 Demo&lt;/title>
&lt;style>
  body { text-align: center; font-family: Arial; background: #f0f0f0; }
  video, canvas { border: 1px solid #ccc; margin-top: 20px; }
  select, button { margin-top: 10px; padding: 8px 16px; font-size: 16px; }
&lt;/style>
&lt;/head>
&lt;body>

&lt;h1>摄像头截图 + 滤镜 + 上传&lt;/h1>

&lt;video id="video" width="400" height="300" autoplay playsinline>&lt;/video>
&lt;br>

&lt;label for="filter">选择滤镜:&lt;/label>
&lt;select id="filter">
  &lt;option value="none">无滤镜&lt;/option>
  &lt;option value="grayscale(100%)">灰度&lt;/option>
  &lt;option value="invert(100%)">反色&lt;/option>
  &lt;option value="blur(3px)">模糊&lt;/option>
&lt;/select>
&lt;br>

&lt;button id="snap">拍照&lt;/button>
&lt;button id="upload">上传截图&lt;/button>
&lt;br>

&lt;canvas id="canvas" width="400" height="300">&lt;/canvas>

&lt;script>
const video = document.getElementById('video');
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
const snapButton = document.getElementById('snap');
const uploadButton = document.getElementById('upload');
const filterSelect = document.getElementById('filter');

// 1️⃣ 获取摄像头
navigator.mediaDevices.getUserMedia({ video: true, audio: false })
  .then(stream => {
    video.srcObject = stream;
    video.play();
  })
  .catch(err => {
    alert('无法访问摄像头: ' + err);
  });

// 2️⃣ 拍照截图
snapButton.addEventListener('click', () => {
  // 先应用滤镜
  ctx.filter = filterSelect.value;
  ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
});

// 3️⃣ 上传截图
uploadButton.addEventListener('click', () => {
  const dataURL = canvas.toDataURL('image/png'); // base64
  // 发送到后台
  fetch('/upload', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ image: dataURL })
  })
  .then(res => res.json())
  .then(data => {
    alert('上传成功: ' + JSON.stringify(data));
  })
  .catch(err => {
    alert('上传失败: ' + err);
  });
});
&lt;/script>

&lt;/body>
&lt;/html>


🔹 功能说明

  1. 摄像头预览
    • getUserMedia({video:true}) 获取视频流
    • playsinline 保证 iOS 内嵌播放
  2. 滤镜效果
    • ctx.filter = ... 支持 CSS 滤镜
    • 可实时在截图上应用滤镜
  3. 截图
    • canvas.drawImage(video,0,0) 捕获当前视频帧
  4. 上传后台
    • canvas.toDataURL('image/png') 转 base64
    • fetch POST 到后台接口 /upload(你可以换成真实接口)
  5. 移动端兼容
    • 手指滑动不会触发全屏
    • 安卓、iOS、桌面浏览器均可使用
退出移动版