JavaScript 实现拍照功能详细示例代码

作者:拾光时间:2026-10-31 05:37:34浏览:193

本文详解如何利用 HTML5 getUserMedia API 在浏览器中调用摄像头。通过 JavaScript 获取视频流并在 video 标签播放,演示如何枚举设备以切换前后摄像头。结合 Canvas 将视频帧转换为 Base64 图片并实现下载保存,最后提供关闭摄像头的方法,适用于无需插件的网页拍照场景。

介绍

HTML5 提供的 getUserMedia API 允许网页应用直接访问硬件设备的媒体资源,包括摄像头、麦克风、音频流以及地理位置信息等。借助这一接口,开发者无需安装任何浏览器插件即可在网页中调用硬件媒体设备,实现更丰富的交互功能。

目前,Firefox、Chrome、Safari 和 Opera 等主流浏览器均已全面支持该 API,确保了跨平台的兼容性与可用性。

一、获取视频流,并用 video 标签播放

 <video id="video" autoplay></video>
const videoConstraints = { width: 1366, height: 768 };
const videoNode = document.querySelector('#video');
let stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: videoConstraints });
videoNode.srcObject = stream;
videoNode.play();

二、多个摄像头设备切换

// enumerateDevices获取所有媒体设备
const mediaDevices = await navigator.mediaDevices.enumerateDevices();

// 通过设备实例king属性videoinput,过滤获取摄像头设备
const videoDevices = mediaDevices.filter(item => item.kind === 'videoinput') || [];

// 获取前置摄像头
const videoDeviceId = videoDevices[0].deviceId;
const videoConstraints = { deviceId: { exact: videoDeviceId }, width: 1366, height: 768 };
let stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: videoConstraints });

// 获取后置摄像头
const videoDeviceId = videoDevices[1].deviceId;
const videoConstraints = { deviceId: { exact: videoDeviceId }, width: 1366, height: 768 };
let stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: videoConstraints });

// 依次类推...

三、拍照保存图片

// 通过canvas捕捉video流,生成base64格式图片
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
canvas.width = 1366;
canvas.height = 768;
context.drawImage(videoNode, 0, 0, canvas.width, canvas.height);
download(canvas.toDataURL('image/jpeg'));

// 下载图片
function download (src) {
   if (!src) return;
   const a = document.createElement('a');
   a.setAttribute('download', new Date());
   a.href = src;
   a.click();
}

关闭摄像头设备

let stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: videoConstraints });
// 3s后关闭摄像头
setTimeout(function () {
    stream.getTracks().forEach(track => track.stop());
    stream = null;
}, 3000);

总结

至此,关于使用 JavaScript 实现拍照功能的教程已介绍完毕。如需了解更多相关实现细节,建议查阅本站历史文章或继续阅读后续内容。感谢支持,期待未来能有更多互动。

作者最新文章