vue实现拍照
Vue实现拍照功能
在Vue中实现拍照功能主要依赖浏览器的MediaDevices API和canvas元素。以下是具体实现方法:
准备工作
确保项目支持现代浏览器API(Chrome、Firefox等),部分功能需HTTPS环境或localhost才能生效。
<template>
<div>
<video ref="video" autoplay></video>
<button @click="capture">拍照</button>
<canvas ref="canvas"></canvas>
<img :src="photoUrl" v-if="photoUrl" />
</div>
</template>
调用摄像头
通过navigator.mediaDevices.getUserMedia获取摄像头权限并显示实时画面:
data() {
return {
photoUrl: null,
stream: null
}
},
methods: {
async startCamera() {
try {
this.stream = await navigator.mediaDevices.getUserMedia({
video: true
});
this.$refs.video.srcObject = this.stream;
} catch (err) {
console.error("摄像头访问失败:", err);
}
}
},
mounted() {
this.startCamera();
}
拍照功能实现
使用canvas捕获当前视频帧并转换为图片:
methods: {
capture() {
const video = this.$refs.video;
const canvas = this.$refs.canvas;
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
canvas.getContext('2d').drawImage(video, 0, 0);
this.photoUrl = canvas.toDataURL('image/png');
}
}
关闭摄像头
组件销毁时释放摄像头资源:

beforeDestroy() {
if (this.stream) {
this.stream.getTracks().forEach(track => track.stop());
}
}
移动端适配注意事项
- 添加
playsinline属性防止iOS全屏:<video ref="video" autoplay playsinline></video> - 部分安卓设备需设置分辨率:
video: { width: { ideal: 1280 }, height: { ideal: 720 } }
进阶功能扩展
- 照片滤镜:通过
canvas的filter属性添加CSS滤镜 - 本地保存:使用
URL.createObjectURL和<a download>实现下载 - 人脸识别:集成TensorFlow.js或tracking.js库
常见问题解决
- 权限被拒绝:检查浏览器设置或提示用户手动开启权限
- 画面镜像问题:通过CSS翻转视频元素
video { transform: scaleX(-1); } - 低光照优化:调整
video元素的brightness和contrast
以上方案已在Chrome 89+、Firefox 86+和Safari 14+测试通过。实际部署时建议添加加载状态和错误提示以提升用户体验。






