<template>
<!--@author : Biodun Bamigboye--->
<div id="container">
<canvas ref="canvas" v-show="image"> </canvas>
<!-- <img :src="image" v-if="image" /> -->
<video autoplay="true" ref="video" v-show="!image"></video>
<select class="form-control" v-model="selectedCamera" @change="start">
<option value="">-- Select Camera Device --</option>
<option v-for="(item, key) in devices" :key="key" :value="item.deviceId">
{{ item.label }}
</option>
</select>
<button @click="start" class="mt-1 btn btn-success rounded">
Start Camera
</button>
<button @click="stop" class="mt-1 btn btn-danger rounded">
Stop Camera
</button>
<button @click="capture" class="mt-1 btn btn-primary rounded">
Capture Image
</button>
</div>
</template>
<script>
export default {
name: "capture-image",
refs: ["video", "canvas"],
data() {
return {
devices: [],
selectedCamera: "",
image: null,
width: 485,
height: 360,
};
},
mounted() {
let cameraDevices = navigator.mediaDevices.enumerateDevices();
cameraDevices.then((result) => (this.devices = result));
console.log(cameraDevices);
},
methods: {
start() {
let video = this.$refs.video;
this.image = null;
if (navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices
.getUserMedia({ video: { deviceId: this.selectedCamera } })
.then(function (stream) {
video.srcObject = stream;
})
.catch(function (error) {
console.log("Something went wrong! " + error);
});
}
},
stop() {
let video = this.$refs.video;
var stream = video.srcObject;
if (!stream) return console.log("No video stream Running");
var tracks = stream.getTracks();
if (tracks.length > 0)
for (var i = 0; i < tracks.length; i++) {
var track = tracks[i];
track.stop();
}
video.srcObject = null;
},
capture() {
let canvas = this.$refs.canvas;
let video = this.$refs.video;
var stream = video.srcObject;
if (!stream) return console.log("No video stream Running");
let context = canvas.getContext("2d");
canvas.width = this.width;
canvas.height = this.height;
context.drawImage(video, 0, 0, this.width, this.height);
const image = canvas.toDataURL("image/png");
this.image = image;
},
},
};
</script>
<style scoped>
#container {
margin: 0px auto;
width: 500px;
height: 375px;
border: 10px #333 solid;
}
video {
width: 485px;
height: 360px;
background-color: #666;
}
</style>
|