纯原生html5+javascript即可实现网页实时拍照:1.用getusermedia获取摄像头流并赋给video.srcobject;2.使video与canvas尺寸及宽高比一致;3.用drawimage捕获帧,todataurl导出jpeg图片;4.需https环境、处理移动端playsinline等兼容性问题。

使用 getUserMedia 获取摄像头权限并实现网页实时拍照,核心是获取视频流、渲染到 <video></video> 标签,再用 <canvas></canvas> 捕获当前帧并导出为图片。整个过程不依赖第三方库,纯原生 HTML5 + JavaScript 即可完成。
1. 请求摄像头权限并播放视频流
调用 navigator.mediaDevices.getUserMedia() 获取用户授权,指定 { video: true } 即可。成功后将媒体流赋给 <video></video> 元素的 srcObject 属性(注意:不是 src):
示例代码:
const video = document.getElementById('video');
async function initCamera() {
try {
const stream = await navigator.mediaDevices.getUserMedia({ video: true });
video.srcObject = stream;
} catch (err) {
console.error('无法访问摄像头:', err.message);
}
}
initCamera();
2. 设置视频显示区域与画布尺寸对齐
为保证拍照清晰,<video></video> 和后续使用的 <canvas></canvas> 应保持相同宽高比(推荐 16:9 或 4:3),且 canvas 宽高最好设为实际分辨率(如 1280×720),避免缩放失真:
- 可通过
video.videoWidth/video.videoHeight动态读取真实分辨率 - 设置
canvas.width和canvas.height后再绘制,否则会拉伸或模糊 - 建议给
<video></video>加autoplay和muted属性(部分浏览器要求静音才能自动播放)
3. 拍照并导出为图片
点击拍照时,用 canvas.getContext('2d').drawImage() 把视频当前帧画到 canvas 上,再调用 canvas.toDataURL('image/jpeg') 获取 base64 图片数据:
关键步骤:
- 确保视频已加载并播放(监听
video的loadeddata或play事件) - 使用
drawImage(video, 0, 0, canvas.width, canvas.height)绘制全帧 - 可传入第 5~8 个参数裁剪/缩放特定区域(如居中截取正方形)
- 导出时指定质量(
toDataURL('image/jpeg', 0.9)),0.1~1.0 之间
简单拍照函数示例:
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
function takePhoto() {
if (!video.srcObject) return;
// 同步 canvas 尺寸到视频实际分辨率
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
const dataUrl = canvas.toDataURL('image/jpeg', 0.95);
// 显示预览或下载
const img = document.getElementById('photo');
img.src = dataUrl;
}
4. 注意事项与兼容性处理
- 必须在 HTTPS 或
localhost环境下运行(HTTP 非本地域会被浏览器拒绝getUserMedia) - 移动端需添加
playsinline属性防止全屏播放干扰布局 - 部分旧版 Safari 需用
webkitGetUserMedia(已基本淘汰,现代项目可忽略) - 用户拒绝权限后,再次调用需用户手动刷新页面或触发新权限请求(不能静默重试)
- 拍照前可加防抖逻辑(如禁用按钮 300ms),避免快速连拍导致 canvas 绘制错乱
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











