Vueはコンピュータカメラを呼び出して写真機能を実現します

Vueはコンピュータカメラを呼び出して写真機能を実現します

この記事の例では、コンピュータカメラを呼び出して写真機能を実現するためのvueの具体的なコードを参考までに共有しています。具体的な内容は次のとおりです。

実装効果図:

写真を撮る前と撮った後(パソコンのカメラが写真を遮ったため、灰色になっています)

1.写真アップロード機能をクリックして、コンピュータのカメラの権限を取得します。

2. カメラの使用を許可するを選択すると、ページ上のカメラ領域に画像が表示され始めます。

3. 写真ボタンをクリックすると、撮影した写真が右側に表示されます。保存をクリック


完全なコード:

ここで書いたのはコンポーネントなので、カメラを呼び出すトリガーイベントは親コンポーネントから渡されます。ページに直接書き込むこともできます。

<テンプレート>
  <div class="カメラボックス" style="幅: 900px;">
    <el-row :gutter="20">
      <el-col :span="12">
        <div style="text-align: center;font-size: 14px;font-weight: bold;margin-bottom: 10px;">カメラ</div>
        <!-- これはカメラで表示された画面です-->
        <ビデオ id="ビデオ" 幅="400" 高さ="300"></ビデオ>
        <div class="iCenter">
          <el-button type='primary' size='small' icon="el-icon-camera" @click="takePhone" style="margin-top: 10px;">写真を撮る</el-button>
        </div>
      </el-col>
      <el-col :span="12">
        <div style="text-align: center;font-size: 14px;font-weight: bold;margin-bottom: 10px;">写真効果</div>
        <!-- クリックして写真を撮ると表示される画像画面です -->
        <canvas id='canvas' width='400' height='300' style="display: block;"></canvas>
        <el-button :loading="loadingbut" icon="el-icon-check" type='primary' size='small' @click="takePhoneUpfile" style="margin-top: 10px;">保存</el-button>
      </el-col>
    </el-row>
</div>
</テンプレート>
<スクリプト>
  「@/api/customer/animalinfo」から {putFileAttach} をインポートします。
  エクスポートデフォルト{
    小道具:{
      tackPhoto:{//親コンポーネントから渡される状態タイプ: ブール値、
        デフォルト:false
      }
    },
    データ() {
      戻る {
        読み込み中:false、
        preViewVisible: false、
        blobFile: null、
        キャンバス: null、
        ビデオ: null、
        メディアストリームトラック: '',
      }
    },
    時計:{
      タック写真:{
        即時: true、
        ハンドラー (newVal){//撮影ステータスを受け取った後、カメラの権限の取得を開始します。関数がコンポーネント内にある場合、以下の手順を独自のトリガーメソッドに直接記述できます。if (newVal) {
            var ビデオ = document.querySelector('ビデオ');
            var テキスト = document.getElementById('テキスト');
            // var mediaStreamTrack;
            
            // 互換性のあるコード window.URL = (window.URL || window.webkitURL || window.mozURL || window.msURL);
            
            navigator.mediaDevices が未定義の場合 {
            ナビゲーター.mediaDevices = {};
            }
            navigator.mediaDevices.getUserMedia が未定義の場合 {
            navigator.mediaDevices.getUserMedia = 関数(制約) {
              var getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
              if (!getUserMedia) {
              return Promise.reject(new Error('getUserMedia はこのブラウザに実装されていません'));
              }
              新しいPromise(function(resolve,reject)を返す{
              getUserMedia.call(ナビゲーター、制約、解決、拒否);
              });
            }
            } 
            
            //カメラ呼び出し設定 var mediaOpts = {
            オーディオ: 偽、
            ビデオ: 本当、
            video: { facingMode: "environment"} // または "user"
            // ビデオ: { 幅: 1280、高さ: 720 }
            // video: { facingMode: { exact: "environment" } } // または "user"
            }

            that=this とします。
            navigator.mediaDevices.getUserMedia(mediaOpts).then(function(stream) {
            that.mediaStreamTrack = ストリーム;
            ビデオ = document.querySelector('ビデオ');
            if (ビデオ内の「srcObject」) {
              video.srcObject = ストリーム
            } それ以外 {
              video.src = window.URL && window.URL.createObjectURL(stream) || ストリーム
            }
            ビデオを再生します。
            }).catch(関数(エラー) {
              コンソール.log(エラー)
            });
          
        }
       },
        深い:本当
      },
    },
    マウント() {
      // カメラ this.video = document.getElementById('video');
      //キャンバス this.canvas = document.getElementById('canvas')
      
    },
    メソッド: {
      takePhone(){//クリックして写真を撮ります。let that = this;
        that.canvas.getContext('2d').drawImage(this.video, 0, 0, 400, 300);
        dataurl = that.canvas.toDataURL('image/jpeg') とします。
        that.blobFile = that.dataURLtoFile(dataurl, 'camera.jpg');
        that.preViewVisible = true
      },
      takePhoneUpfile(){//画像を保存 this.loadingbut=true;
        formData = new FormData() とします。
        formData.append('file', this.blobFile);//画像コンテンツ//画像をアップロード putFileAttach(formData).then(res=>{//バックエンドインターフェース this.loadingbut=false;
          this.$emit('picture',res.data.data);
          this.tackPhoto=false;
          this.canvas.getContext('2d').clearRect(0, 0, 400, 300);//キャンバスをクリア//カメラを閉じる this.mediaStreamTrack.getVideoTracks().forEach(function (track) {
            トラックを停止します。
           });
        },エラー=>{
          this.loadingbut=false;
          window.console.log(エラー);
        });
      },
    }
  }
</スクリプト>
<スタイル>
 .camera-box #キャンバス{
  境界線: 1px 実線 #DCDFE6;
  }
</スタイル>

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vue は PC カメラを呼び出してリアルタイムで写真を撮る機能を実装します
  • VueはPCカメラを呼び出して写真機能を実現します
  • Vueはローカルカメラを呼び出して写真機能を実現します
  • Vue2.0はカメラを呼び出して写真を撮る機能を実装し、exif.jsは写真アップロード機能を実装します。
  • Vueはカメラを呼び出して写真を撮り、ローカルに保存します

<<:  MySQL でタイムスタンプを日付に変換する例

>>:  docker compose の使い方の詳しい説明

推薦する

JavaScriptのループの違いについての詳細な説明

目次序文列挙可能なプロパティ反復可能なオブジェクトforEachメソッドとmapメソッドチェーン呼び...

Vueのイベント処理とイベント修飾子の詳細な説明

<div id="ルート"> <h2>頑張れ、{{na...

メッセージボードにメッセージを追加および削除するための JavaScript

この記事では、JavaScript メッセージ ボードでメッセージを追加および削除する小さな例を詳細...

2012年のベストWebデザイン作品レビュー[パート1]

新年の初めに、友人の健康と2013年が素晴らしい年となることを心からお祈りいたします。この記事では、...

Vue3ライフサイクル関数とメソッドの詳細な説明

1. 概要いわゆるライフサイクル機能とは、特定の条件下で自動的にトリガーされる機能です。 2. VU...

DockerがElasticsearch7.xを起動してエラーを報告する問題を解決する

Docker実行コマンドの使用docker run -d -p 9200:9200 -p 9300:...

Vue テンプレートのコンパイルの詳細

目次1. 解析する1.1 傍受のルール1.2 傍受プロセス部分1.3 パーサーの概要2. 最適化する...

CSSでよく使われるフォントスタイルを設定することで様々なフォントの変更が可能(例詳細説明)

CSS フォント プロパティは、テキストのフォント ファミリ、サイズ、太字、スタイル (斜体など)...

Windows での MySQL 5.7.18 インストール チュートリアル

この記事では、圧縮パッケージから MySQL をインストールする方法について説明します。 1. My...

MySQL がデータの削除と挿入に非常に時間がかかる問題の解決策

会社の開発者がテスト環境で挿入ステートメントを実行すると、正常に実行されるまでに 10 秒以上かかり...

Linux は、ディレクトリが存在するかどうかを判断するために if を使用します。

Linux で if を使用してディレクトリが存在するかどうかを判断する方法方法は次のとおりです。...

HTMLでのラジオ値の取得、割り当て、登録の詳細な説明

1. ラジオのグループ化名前が同じであれば、それらはグループであり、つまり、次のようにグループ内で選...

MySQL シャーディングの詳細

1. ビジネスシナリオの紹介MySQLを使用する電子商取引システムがあるとします。大量のデータを保存...

HTMLノードの追加と削除の簡単な例

HTML ノードの追加と削除の簡単な例 HTML ノードの追加と削除の簡単な例<input t...

Dockerディスク容量不足の問題を解決する

Docker が配置されているサーバーをしばらく稼働させたところ、サーバーのディスク ディレクトリの...