<template> <div class="camera"> <div class="header flex justify-between title-box"> <button type="button" class="flex align-center" @click="goToPage('Dashboard')"> <svg-icon type="mdi" :path="mdilChevronLeft" style="width: 50px; height: 50px;"></svg-icon> <p class="title"> 이전글</p> </button> <button @click="captureAndGoToPhotoDesign"> <img src="../../../resources/img/btn19_74s_normal.png" alt=""> </button> </div> <div class="body" ref="body"> <div id="container" ref="container"> <video v-if="!photoTaken" autoplay="true" ref="modalVideoElement" class="mirrored" @canplay="onVideoLoaded"></video> </div> </div> </div> </template> <script> import SvgIcon from '@jamescoyle/vue-icon'; import { mdiMagnify, mdiWindowClose } from '@mdi/js'; import { mdilChevronRight, mdilChevronLeft } from '@mdi/light-js'; import axios from "axios"; export default { data() { return { selectedTab: 'tab1', username: '', password: '', mdiWindowClose: mdiWindowClose, mdilChevronLeft: mdilChevronLeft, showModal: false, searchOpen: false, photoTaken: false, stream: null, videoReady: false, } }, methods: { goToPage(page) { this.$router.push({ name: page }); }, closeModal() { this.showModal = false; if (this.stream) { let tracks = this.stream.getTracks(); tracks.forEach(track => track.stop()); this.stream = null; } }, buttonSearch() { this.searchOpen = true; }, closeBtn() { this.searchOpen = false; }, onVideoLoaded() { this.videoReady = true; this.adjustContainerSize(); }, adjustContainerSize() { const video = this.$refs.modalVideoElement; const container = this.$refs.container; const body = this.$refs.body; if (video && container) { container.style.width = `${video.videoWidth}px`; container.style.height = `${video.videoHeight}px`; body.style.height = `${video.videoHeight}px`; } }, captureAndGoToPhotoDesign() { const video = this.$refs.modalVideoElement; const canvas = document.createElement('canvas'); canvas.width = video.videoWidth; canvas.height = video.videoHeight; const ctx = canvas.getContext('2d'); // 좌우 반전 적용 ctx.translate(canvas.width, 0); ctx.scale(-1, 1); ctx.drawImage(video, 0, 0, canvas.width, canvas.height); const imageDataUrl = canvas.toDataURL('image/png'); this.$router.push({ name: 'PhotoDesign', query: { image: imageDataUrl } }); } }, mounted() { // Clear localStorage when the component is mounted localStorage.removeItem('capturedImage'); this.videoReady = false; navigator.mediaDevices.getUserMedia({ video: true }) .then(stream => { const modalVideo = this.$refs.modalVideoElement; modalVideo.srcObject = stream; this.stream = stream; modalVideo.addEventListener('loadedmetadata', this.adjustContainerSize); }) .catch(error => { console.log("error>>>>>>>>", error); }); }, components: { SvgIcon }, } </script> <style> .body { width: 1435px; height: auto; margin: 0 auto; } #container { position: relative; margin: auto; border: 10px #333 solid; display: flex; justify-content: center; align-items: center; } video { width: 100%; height: auto; background-color: #666; } .mirrored { transform: scaleX(-1); } </style>