LWCでカメラキャプチャコンポーネントの実装

#### Lightning Web Component（LWC）を使用して、カメラからビデオをキャプチャし、画像をキャプチャするための簡単なカメラキャプチャコンポーネントを実装しています。

1.Start Video : カメラを初期化し、ビデオストリームを取得してビデオエレメントにセットします。navigator.mediaDevices.getUserMedia() メソッドを使用して、ユーザーのメディアデバイスにアクセスします。

2.Stop Video : カメラを停止します。video.srcObject.getTracks().forEach((track) => track.stop()); を使用して、ビデオストリームのトラックを停止します。

3.Capture Image : ビデオからキャプチャした画像を canvas に描画し、そのデータを取得して画像エレメントに表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/3827c4fe-75d2-4679-84f2-8e5768268ad6.png)

```html:cameraCapture.html
<template>
    <div class="camera-wrapper">
        <lightning-button label="Start Video" class="slds-m-left_xx-small" onclick={initCamera}></lightning-button>
        <lightning-button label="Stop Video" class="slds-m-left_xx-small" onclick={stopCamera}></lightning-button>
        <lightning-button label="Capture Image" class="slds-m-left_xx-small" onclick={captureImage}></lightning-button>
    </div>
    <div class="slds-grid slds-gutters">
        <div class="slds-col">
            <video class="videoElement" autoplay></video>
            <canvas class="slds-hide canvas"></canvas>
        </div>
        <div class="slds-col">
            <img src="" class="slds-hide imageElement" alt="captured image"/>
        </div>
    </div>
</template>
```

```js:cameraCapture.js
import {LightningElement} from 'lwc';

export default class CameraCapture extends LightningElement {
    videoElement;
    canvasElement;


    renderedCallback() {
        this.videoElement = this.template.querySelector('.videoElement');
        this.canvasElement = this.template.querySelector('.canvas');
    }


    async initCamera() {
        if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
            try {
                this.videoElement.srcObject = await navigator.mediaDevices.getUserMedia({video: true, audio: false});
            } catch (error) {
                console.error('Error accessing the camera: ', JSON.stringify(error));
            }
        } else {
            console.error('getUserMedia is not supported in this browser');
        }
    }

    async captureImage() {
        if(this.videoElement && this.videoElement.srcObject !== null) {
            this.canvasElement.height = this.videoElement.videoHeight;
            this.canvasElement.width = this.videoElement.videoWidth;
            const context = this.canvasElement.getContext('2d');
            context.drawImage(this.videoElement, 0, 0, this.canvasElement.width, this.canvasElement.height);
            const imageData = this.canvasElement.toDataURL('image/png');
            const imageElement = this.template.querySelector('.imageElement');
            imageElement.setAttribute('src', imageData);
            imageElement.classList.add('slds-show');
            imageElement.classList.remove('slds-hide');
        }
    }

    async stopCamera(){
        const video = this.template.querySelector(".videoElement");
        video.srcObject.getTracks().forEach((track) => track.stop());
        video.srcObject = null;
        this.hideImageElement();
    }

    hideImageElement(){
        const imageElement = this.template.querySelector('.imageElement');
        imageElement.setAttribute('src', "");
        imageElement.classList.add('slds-hide');
        imageElement.classList.remove('slds-show');
    }
}
```

次の記事で、画像をOCRしてテキストをSalesforceに保存するように実装したいと思います。

上記のコードは[こちらの記事](https://connectsalesforce.hashnode.dev/lwc-how-to-access-your-device-camera)を参考にしています。