vue3開(kāi)啟攝像頭并進(jìn)行拍照的實(shí)現(xiàn)示例
一、前言
Vue3 調(diào)用本地?cái)z像頭實(shí)現(xiàn)拍照功能,由于調(diào)用攝像頭有使用權(quán)限,只能在本地運(yùn)行,線(xiàn)上需用 https 域名才可以使用。主要是使用navigator.mediaDevices.getUserMedia這個(gè)API來(lái)實(shí)現(xiàn)。
二、文檔
navigator.mediaDevices.getUserMedia,MDN的官方文檔點(diǎn)擊【前往】。
向用戶(hù)請(qǐng)求獲得媒體輸入的許可,返回一個(gè)MediaStream,我們可以使用MediaStream與video組件綁定輸出攝像頭拍攝的視頻,也能記錄麥克風(fēng)的音頻

三、實(shí)現(xiàn)
3.1、封裝
封裝組件take-photo.vue
/**
* @Description: 拍照
* @author 小馬甲丫
* @date 2024-01-07 12:03:04
*/
<template>
<a-modal
:width="800"
:height="600"
title="讀身份證"
@cancel="hideModal"
v-model:visible="visibleFlag"
>
<!-- 畫(huà)筆控件 用來(lái)拍照 -->
<canvas style="display: none" ref="canvasDom"></canvas>
<!-- 播放器,用來(lái)播放拍攝的視頻 -->
<video v-if="!imgurl" class="camera_video" ref="videoDom"></video>
<!-- 顯示照片 -->
<img v-else :src="imgurl" />
<template #footer>
<a-space>
<a-button @click="hideModal">關(guān)閉</a-button>
<a-button type="primary" @click="takePhoto">{{ imgurl ? "重拍" : "拍照" }}</a-button>
</a-space>
</template>
</a-modal>
</template>
<script setup>
import { ref, nextTick } from "vue";
// canvas控件對(duì)象
const canvasDom = ref(null);
// video 控件對(duì)象
const videoDom = ref(null);
// 照片路徑
const imgurl = ref(null);
const emits = defineEmits(['save']);
// ------------------ 顯示,關(guān)閉 ------------------
// 顯示
const visibleFlag = ref(false);
function showModal() {
imgurl.value = ''
visibleFlag.value = true;
openCamera();
}
// 關(guān)閉
function hideModal() {
visibleFlag.value = false;
}
const openCamera = () => {
// 檢測(cè)瀏覽器是否支持mediaDevices
if (navigator.mediaDevices) {
navigator.mediaDevices
// 開(kāi)啟視頻,關(guān)閉音頻
.getUserMedia({audio: false, video: true})
.then((stream) => {
// 將視頻流傳入viedo控件
videoDom.value.srcObject = stream;
// 播放
videoDom.value.play();
})
.catch((err) => {
console.log(err);
});
} else {
window.alert("該瀏覽器不支持開(kāi)啟攝像頭,請(qǐng)更換最新版瀏覽器");
}
};
// 拍照
const takePhoto = () => {
// 如果已經(jīng)拍照了就重新啟動(dòng)攝像頭
if (imgurl.value) {
imgurl.value = null;
openCamera()
return;
}
// 設(shè)置畫(huà)布大小與攝像大小一致
canvasDom.value.width = videoDom.value.videoWidth;
canvasDom.value.height = videoDom.value.videoHeight;
// 執(zhí)行畫(huà)的操作
canvasDom.value.getContext("2d").drawImage(videoDom.value, 0, 0);
// 將結(jié)果轉(zhuǎn)換為可展示的格式
imgurl.value = canvasDom.value.toDataURL("image/webp");
// 關(guān)閉攝像頭
stop();
nextTick(() => {
emits('save', imgurl.value)
hideModal()
})
}
// 關(guān)閉攝像頭
const stop = () => {
let stream = videoDom.value.srcObject;
if (!stream) return;
let tracks = stream.getTracks();
tracks.forEach((x) => {
x.stop();
});
};
// ----------------------- 以下是暴露的方法內(nèi)容 ------------------------
defineExpose({
showModal,
hideModal
});
</script>
<style lang="less" scoped>
.camera_video {
width: 100%;
height: 100%;
border: 2px black solid;
}
</style>
3.2、使用
/**
* @Description: 使用
* @author 小馬甲丫
* @date 2023-12-20 08:07:47
*/
<template>
<div>
<img :src="photo" />
<a-button ghost type="primary" @click="readCard">拍照</a-button>
<TakePhoto ref="photoRef" @save="handlePhoto" />
</div>
</template>
<script setup>
import { ref } from 'vue';
import TakePhoto from './take-photo.vue';
const photoRef = ref()
const photo = ref()
// 拍照
function readCard() {
photoRef.value.showModal()
}
// 拍照回調(diào)
function handlePhoto(img) {
photo.value = img
}
</script>
3.3、效果

四、最后
到此這篇關(guān)于vue3開(kāi)啟攝像頭并進(jìn)行拍照的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)vue3開(kāi)啟攝像頭拍照內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue如何調(diào)用攝像頭實(shí)現(xiàn)拍照上傳圖片、本地上傳圖片
- vue調(diào)用攝像頭進(jìn)行拍照并能保存到本地的方法
- Vue實(shí)現(xiàn)調(diào)用PC端攝像頭實(shí)時(shí)拍照
- Vue調(diào)用PC攝像頭實(shí)現(xiàn)拍照功能
- vue調(diào)取電腦攝像頭實(shí)現(xiàn)拍照功能
- vue調(diào)用本地?cái)z像頭實(shí)現(xiàn)拍照功能
- Vue2.0實(shí)現(xiàn)調(diào)用攝像頭進(jìn)行拍照功能 exif.js實(shí)現(xiàn)圖片上傳功能
- vue 獲取攝像頭拍照并旋轉(zhuǎn)、裁剪生成新的圖片功能實(shí)現(xiàn)
相關(guān)文章
el-select單選時(shí)選擇后輸入框的is-focus狀態(tài)并沒(méi)有取消問(wèn)題解決
這篇文章主要給大家介紹了關(guān)于el-select單選時(shí)選擇后輸入框的is-focus狀態(tài)并沒(méi)有取消問(wèn)題的解決過(guò)程,文中通過(guò)圖文以及代碼示例將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
Vue+axios實(shí)現(xiàn)統(tǒng)一接口管理的方法
這篇文章主要介紹了Vue+axios實(shí)現(xiàn)統(tǒng)一接口管理的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
Vue中使用create-keyframe-animation與動(dòng)畫(huà)鉤子完成復(fù)雜動(dòng)畫(huà)
這篇文章主要介紹了Vue中使用create-keyframe-animation與動(dòng)畫(huà)鉤子完成復(fù)雜動(dòng)畫(huà),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04
詳解VueRouter進(jìn)階之導(dǎo)航鉤子和路由元信息
本篇文章主要介紹了詳解VueRouter進(jìn)階之導(dǎo)航鉤子和路由元信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
el-form表單實(shí)現(xiàn)校驗(yàn)的示例代碼
本文主要介紹了el-form表單實(shí)現(xiàn)校驗(yàn)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
vue 彈窗時(shí) 監(jiān)聽(tīng)手機(jī)返回鍵關(guān)閉彈窗功能(頁(yè)面不跳轉(zhuǎn))
這篇文章主要介紹了vue 彈窗時(shí) 監(jiān)聽(tīng)手機(jī)返回鍵關(guān)閉彈窗功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值(頁(yè)面不跳轉(zhuǎn)) ,需要的朋友可以參考下2019-05-05
vue 解決computed修改data數(shù)據(jù)的問(wèn)題
今天小編就為大家分享一篇vue 解決computed修改data數(shù)據(jù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11

